none
Symboles filesystem inconnus (UWP + Visual Studio 2015) RRS feed

  • Discussion générale

  • Bonjour,

    J’ai besoin d’utiliser les fonctions standard de filesystem sur une application UWP. En suivant cette documentation => https://msdn.microsoft.com/fr-fr/library/hh874694.aspx , j’ai ajouté les lignes suivantes dans un fichier C++ (MainPage.xaml.cpp pour être précis) :

    #include <filesystem>  
    using namespace std::tr2::sys;  
    

    Puis dans le même fichier C++, j’ai voulu exécuter le code suivant :

    void MainPage::MainPage::button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
    {
    	path p1(".");
    	path p2 = absolute(p1);
    }
    

    (Notez que les objets path et la fonction absolute font partis du header <filesysem>)

    Par la suite, en compilant, j’ai malheureusement eu les erreurs de compilation suivantes :

    Erreur    C3083    'tr2' : le symbole situé à gauche de '::' doit être un type   
    Erreur    C3083    'sys' : le symbole situé à gauche de '::' doit être un type   
    Erreur    C2039    'path' : n'est pas membre de 'std'   
    Erreur    C2065    'path' : identificateur non déclaré   
    Erreur    C2146    erreur de syntaxe : absence de ';' avant l'identificateur 'p1'   
    Erreur    C3861    'p1' : identificateur introuvable   

    Je ne comprends pas bien d’où ces erreurs proviennent, en l’occurrence, j’ai pu ouvrir le fichier filesystem et constater la présence desdites classes et fonctions, mais rien n’y fait. Par ailleurs, je me suis demandé, en regardant l’en-tête <filesystem> si le namespace était bien std::tr2::sys ou std::experimenta::filesystem::v1.

    Quelqu’un saurait-il comment les fonctions de l’en-tête <filesystem> doivent être utilisée ?

    Cordialement,

    mardi 8 novembre 2016 16:57

Toutes les réponses

  • Bonjour John,

    Les objets de type path représentent des chemins sur un système de fichiers. Seuls les aspects syntaxiques des chemins sont gérés: le chemin d'accès peut représenter un chemin non existant ou même celui qui n'est pas autorisé à exister sur le système de fichiers ou le système d'exploitation actuel.

    Le nom du chemin d'accès présente la syntaxe suivante:

    [Example:
    
        std::cout << path("/foo/bar.txt").stem(); //sortie "bar" (sans quotes)
    
        path p = "foo.bar.baz.tar";
        for (; !p.extension().empty(); p = p.stem())
          std::cout << p.extension() << '\n';
          // sorties : .tar
          //           .baz
          //           .bar
    
    --end example]

    la documentation que tu a utilisé n’était pas trop complète pour bien comprendre la fonction filesystem vérifie le lien suivant:

    Cliquer ici et Cliquer ici et Cliquer ici aussi.

    Voici un autre exemple de code fais sur linux pas sur VS:

    #include <iostream>
    #include <filesystem>
     
    int main() 
    {
        std::tr2::sys::path mypath="c:\\temp";
     
        std::cout << "path_exists  = " << std::tr2::sys::exists(mypath) << '\n';
        std::cout << "is_directory = " << std::tr2::sys::is_directory(mypath) << '\n';
        std::cout << "is_file      = " << std::tr2::sys::is_empty(mypath) << '\n';
     
        auto lasttime = std::tr2::sys::last_write_time(mypath);
        char buffer[50] = {0};
        ctime_s(buffer, sizeof(buffer), &lasttime);
        std::cout << "last_write   = " << buffer << '\n';
     
        std::tr2::sys::recursive_directory_iterator endit;
        std::tr2::sys::recursive_directory_iterator it(mypath);
        for(; it != endit; ++it)
        {
            auto& apath = it->path();
     
            if(std::tr2::sys::is_directory(apath) && std::tr2::sys::is_symlink(apath))
            {
                it.no_push();
            }
     
            print(apath, it.level());
        }
     
        return 0;
    }
      }
      else
        cout << p << "n'existe pas\n";
    
      return 0;
    }

    et la sortie :

    path_exists  = 1
    is_directory = 1
    is_file      = 0
    last_write   = Wed Nov 09 01:00:39 2016
     
    +dir1
    ├+dir11
    │├+dir111
    ││├+dir1111
    │││├-file1111.txt
    │││├-file1112.txt
    ││├-file111.txt
    ││├-file112.txt
    │├-file11.txt
    │├-file12.txt
    ├+dir12
    ├-file11.txt
    ├-file12.txt
    ├-file13.txt
    -file1.txt
    -file2.txt


    Cordialement.


    The formal education will help you make a life. The self-education will help you make a fortune.Please remember to click Mark as Answer the responses that resolved your issue, and to click Unmark as Answer if not.




    mardi 8 novembre 2016 22:33
  • Comme indiquer en gros dans l'encart "Important" de l'article, il s'agit de fonctionnalités non standards.

    le "tr2" du namespace, c'est pour "technical review", donc un sur un draft de la norme, pas la norme.

    L'utilisation de ces fonctionnalités non standards est assujettie très vraisemblablement à la définition de constantes de compilation ad hoc. Pour les connaitre, une simple lecture des "#define" utilisées dans le fichier <filesystem> pour rendre visible ou non ces classes devrait faire l'affaire.


    Paul Bacelar, Ex - MVP VC++

    mercredi 9 novembre 2016 10:35
    Modérateur