Outils d'utilisateurs

Outils du Site


c_1y_file_system

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

c_1y_file_system [2014/03/12 12:05]
gbdivers
c_1y_file_system [2014/10/05 15:12] (Version actuelle)
91.182.106.28 [Les classes et énumérations]
Ligne 5: Ligne 5:
 ===== Les classes et énumérations ===== ===== Les classes et énumérations =====
  
-Le draft [[https://github.com/cplusplus/filesystem-ts|N3803]] est relativement simple à lire, puisqu'il n'y a pas de modification du langage, mais simplement des ajouts sous forme de bibliothèque. Ceux qui ont déjà utilisé une bibliothèque de gestion de fichiers retrouveront des éléments familiers. Du coup, je ne vais pas reprendre en détail le document (ce qui reviendrait en gros à le traduire), mais je vais donner des exemples de code pour répondre à des problématique spécifiques. Pour ceux intéressé par les détails, je vais juste décrire l'organisation du draft.+Le draft [[https://github.com/cplusplus/filesystem-ts|N3803]] est relativement simple à lire, puisqu'il n'y a pas de modification du langage, mais simplement des ajouts sous forme de bibliothèque. Ceux qui ont déjà utilisé une bibliothèque de gestion de fichiers retrouveront des éléments familiers. Du coup, je ne vais pas reprendre en détail le document (ce qui reviendrait en gros à le traduire), mais je vais donner des exemples de code pour répondre à des problématiques spécifiques. Pour ceux intéressés par les détails, je vais juste décrire l'organisation du draft.
  
 Le document commence à définir un ensemble de notions généralistes sur les systèmes de fichiers : ce qu'est un fichier, un répertoire, un nom de fichier ou de répertoire, un lien, ainsi que les notions de chemin absolu, relatif ou canonique. Le document commence à définir un ensemble de notions généralistes sur les systèmes de fichiers : ce qu'est un fichier, un répertoire, un nom de fichier ou de répertoire, un lien, ainsi que les notions de chemin absolu, relatif ou canonique.
  
-Ensuite, le document décrit les différentes types :+Ensuite, le document décrit les différents types :
  
   * la classe ''path'', qui représente un chemin vers un fichier ou répertoire ;   * la classe ''path'', qui représente un chemin vers un fichier ou répertoire ;
   * la classe ''filesystem_error'' pour la gestion des erreurs ;   * la classe ''filesystem_error'' pour la gestion des erreurs ;
-  * l'énumération ''file_type'' pour lister les types (fichier, répertoire, lien, etc) ; +  * l'énumération ''file_type'' pour lister les types (fichier, répertoire, lien, etc.) ; 
-  * l'énumération ''copy_options'' pour lister les options possibles lors d'une copie (écraser les fichiers existants, parcourir les sous-répertoires, suivre les liens symboliques, et.) ; +  * l'énumération ''copy_options'' pour lister les options possibles lors d'une copie (écraser les fichiers existants, parcourir les sous-répertoires, suivre les liens symboliques, etc.) ; 
-  * l'énumération ''perms'' pour lister les permissions d'un fichier (propriétaire du fichier, groupe d'utilisateurs, etc) ;+  * l'énumération ''perms'' pour lister les permissions d'un fichier (propriétaire du fichier, groupe d'utilisateurs, etc.) ;
   * la classe ''file_status'' pour gérer le type de fichier et les permissions d'accès ;   * la classe ''file_status'' pour gérer le type de fichier et les permissions d'accès ;
   * la classe ''directory_entry'' représente une entrée dans un répertoire, avec un chemin et les statuts du fichier ;   * la classe ''directory_entry'' représente une entrée dans un répertoire, avec un chemin et les statuts du fichier ;
Ligne 23: Ligne 23:
 Pour terminer, le document définit l'ensemble des fonctions libres pour copier, renommer, déplacer ou supprimer des fichiers et répertoires, manipuler les chemins, tester le type et les accès des fichiers, créer des liens. Pour terminer, le document définit l'ensemble des fonctions libres pour copier, renommer, déplacer ou supprimer des fichiers et répertoires, manipuler les chemins, tester le type et les accès des fichiers, créer des liens.
  
-L'ensemble des fonctionnalités est accessible via l'en-tête <filesystem>.+L'ensemble des fonctionnalités est accessible via l'en-tête ''<filesystem>''.
  
 ===== La gestion des erreurs ===== ===== La gestion des erreurs =====
Ligne 42: Ligne 42:
 Il est donc conseillé en C++ d'utiliser des classes assurant le RAII : les pointeurs intelligents (''shared_ptr'', ''weak_ptr'', ''unique_ptr''), les conteneurs standards (''vector'', ''list'', ''map'', etc.) et plus généralement les outils de la STL (''string'', ''stream'', etc). Je vous conseille la lecture de l'article [[http://alexandre-laurent.developpez.com/cpp/retour-fonctions-ou-exceptions/|Retour de fonctions ou exceptions ?]] Il est donc conseillé en C++ d'utiliser des classes assurant le RAII : les pointeurs intelligents (''shared_ptr'', ''weak_ptr'', ''unique_ptr''), les conteneurs standards (''vector'', ''list'', ''map'', etc.) et plus généralement les outils de la STL (''string'', ''stream'', etc). Je vous conseille la lecture de l'article [[http://alexandre-laurent.developpez.com/cpp/retour-fonctions-ou-exceptions/|Retour de fonctions ou exceptions ?]]
  
-En complément, le C++11 introduit un nouveau mot-clé ''noexcept'' qui permet d'indiquer qu'une fonction ne retournera pas d'exception (c'est-à-dire qu'elle ne lance pas d'exception et qu'elle n'appelle que des fonctions ''noexcept'').+En complément, le C++11 introduit un nouveau mot-clé ''noexcept'' qui permet d'indiquer qu'une fonction ne retournera pas d'exception (c'est-à-dire ne lançant pas d'exception et n’appelant que des fonctions ''noexcept'').
  
-Les fonctions de //File System// existent en deux versions, l'une utilisant la gestion d'erreur par exception et l'autre par un code d'erreur. Pour garder les signatures des fonctions similaires, le code d'erreur est passé comme argument (référence non constante) et non en retour de fonction.+Les fonctions de //File System// existent en deux versions, l'une utilisant la gestion d'erreur par exception et l'autre par code d'erreur. Pour garder les signatures des fonctions similaires, le code d'erreur est passé comme argument (référence non constante) et non en retour de fonction.
  
 Ainsi, pour tester l’existence d'un fichier, la fonction ''exists'' existe selon les deux signatures suivantes : Ainsi, pour tester l’existence d'un fichier, la fonction ''exists'' existe selon les deux signatures suivantes :
Ligne 53: Ligne 53:
 </code> </code>
  
-La première version ne prend pas de code d'erreur en argument, la second oui (et est donc déclarée en ''noexcept''). Pour les utiliser :+La première version ne prend pas de code d'erreur en argument, la seconde oui (et est donc déclarée en ''noexcept''). Pour les utiliser :
  
 <code cpp> <code cpp>
Ligne 77: Ligne 77:
 ===== Les fonctions libres ===== ===== Les fonctions libres =====
  
-Beaucoup de fonction prennent en paramètre un objet de type ''path'' ou de type ''file_status''. Comme il existe un constructeur (non ''explicit'') de ''path'' prenant en paramètre une chaîne, il est possible d'appeler les fonctions directement avec une chaîne.+Beaucoup de fonctions prennent en paramètre un objet de type ''path'' ou de type ''file_status''. Comme il existe un constructeur (non ''explicit'') de ''path'' prenant en paramètre une chaîne, il est possible d'appeler les fonctions directement avec une chaîne.
  
 <code cpp> <code cpp>
Ligne 86: Ligne 86:
 </code> </code>
  
-==== Connaître le répertoire courant ====+===== Connaître le répertoire courant =====
  
 <code cpp> <code cpp>
Ligne 92: Ligne 92:
 </code> </code>
  
-==== Chemin relatif, absolu, canonique ====+===== Chemin relatif, absolu, canonique =====
  
 Un chemin n'est pas représenté par une écriture unique, plusieurs chaînes de caractères peuvent correspondre à un même chemin (et donc au même fichier ou même répertoire) : Un chemin n'est pas représenté par une écriture unique, plusieurs chaînes de caractères peuvent correspondre à un même chemin (et donc au même fichier ou même répertoire) :
Ligne 100: Ligne 100:
   * le chemin canonique est le chemin absolu sans lien symbolique ou élément ''.'' et ''..''   * le chemin canonique est le chemin absolu sans lien symbolique ou élément ''.'' et ''..''
  
-Les fonction ''absolute'' et ''canonical'' permettent d'obtenir les chemins absolu et canonique :+Les fonctions ''absolute'' et ''canonical'' permettent d'obtenir les chemins absolu et canonique :
  
 <code cpp> <code cpp>
Ligne 107: Ligne 107:
 auto path_absolute = absolute("my_file.cpp", "/home/me"); auto path_absolute = absolute("my_file.cpp", "/home/me");
  
-auto path_cononical = canonical(old_path);+auto path_canonical = canonical(old_path);
 auto path_canonical = canonical("my_file.cpp"); auto path_canonical = canonical("my_file.cpp");
 auto path_canonical = canonical("my_file.cpp", "/home/me"); auto path_canonical = canonical("my_file.cpp", "/home/me");
Ligne 120: Ligne 120:
 </code> </code>
  
-==== Statuts des fichiers ====+===== Statuts des fichiers =====
  
 La fonction ''statuts'' permet de connaître le type et les permissions d'un fichier. La fonction ''statuts'' permet de connaître le type et les permissions d'un fichier.
Ligne 127: Ligne 127:
 auto file_statuts = statuts(my_file); auto file_statuts = statuts(my_file);
 auto perms = file_statuts.permissions(); auto perms = file_statuts.permissions();
-if (file_statuts.type() == file_type.regular)+if (file_statuts.type() = file_type.regular)
     cout << "Est un fichier régulier" << endl;     cout << "Est un fichier régulier" << endl;
 </code> </code>
Ligne 148: Ligne 148:
 </code> </code>
  
-La fonction ''statuts'' peut émettre une exception ''filesystem_error'' si le type détecté est ''file_type::none''. Attention, les types ''file_type::not_found'' et ''file_type::unknown'' ne sont pas considérées comme des erreurs et ne lancent pas d'exception (cela est considéré comme étant normal dans le fonctionnement des systèmes de fichiers).+La fonction ''statuts'' peut émettre une exception ''filesystem_error'' si le type détecté est ''file_type::none''. Attention, les types ''file_type::not_found'' et ''file_type::unknown'' ne sont pas considérés comme des erreurs et ne lancent pas d'exception (cela est considéré comme étant normal dans le fonctionnement des systèmes de fichiers).
  
-Pour terminer, la fonction ''status_known'' permet de tester qu'un statut est connu (c'est-à-dire qu'il n'est pas de type ''file_type::none'').+Pour terminer, la fonction ''status_known'' permet de tester si un statut est connu (c'est-à-dire qu'il n'est pas de type ''file_type::none'').
  
 <code cpp> <code cpp>
Ligne 162: Ligne 162:
 auto file_statuts = symlink_status(my_file); auto file_statuts = symlink_status(my_file);
 </code> </code>
-  + 
-=== La date de la dernière modification ===+==== La date de la dernière modification ====
  
 <code cpp> <code cpp>
Ligne 170: Ligne 170:
 </code> </code>
  
-=== Taille des fichiers ===+==== Taille des fichiers ====
  
 <code cpp> <code cpp>
Ligne 184: Ligne 184:
 cout << s.capacity << endl; // capacité cout << s.capacity << endl; // capacité
 cout << s.free << endl; // espace libre cout << s.free << endl; // espace libre
-cout << s.available << endl; // espace  +cout << s.available << endl; // espace 
-    // disponible, en fonction des autorisation d'accès+    // disponible, en fonction des autorisations d'accès
 </code> </code>
  
-=== Gérer les permissions d'accès ===+==== Gérer les permissions d'accès ====
  
 Les permissions sont définies dans l'énumération ''perms'', pour le propriétaire, le groupe et les autres : Les permissions sont définies dans l'énumération ''perms'', pour le propriétaire, le groupe et les autres :
Ligne 208: Ligne 208:
     * ''others_exec'' (exécutable) ;     * ''others_exec'' (exécutable) ;
     * ''others_all'' (tout) ;     * ''others_all'' (tout) ;
-  * ''all'' (toutes les permissions, pour tot le monde) ; +  * ''all'' (toutes les permissions, pour tout le monde) ; 
-  * Pour les identifiant+  * Pour les identifiants :
     * ''set_uid'' (user id) ;     * ''set_uid'' (user id) ;
     * ''set_gid'' (group id) ;     * ''set_gid'' (group id) ;
Ligne 227: Ligne 227:
  
 <code cpp> <code cpp>
-permissions(my_file, perms(all)); +permissions(my_file, perms(all));
     // donne les permissions à tout le monde     // donne les permissions à tout le monde
-     + 
-permissions(my_file, perms(others_all | remove_perms));  +permissions(my_file, perms(others_all | remove_perms)); 
-    // supprimer toutes les permissions des autres+    // supprime toutes les permissions des autres
  
 permissions(my_file, perms(other_read | add_perms)); permissions(my_file, perms(other_read | add_perms));
Ligne 243: Ligne 243:
 </code> </code>
  
-==== Manipulation des fichiers et répertoires ====+===== Manipulation des fichiers et répertoires =====
  
-=== Copie ===+==== Copie ====
  
 Les options de copie sont définies dans l'énumération ''copy_options'' : Les options de copie sont définies dans l'énumération ''copy_options'' :
Ligne 257: Ligne 257:
     * ''none'' (ne rien faire) ;     * ''none'' (ne rien faire) ;
     * ''recursive'' (parcourir les sous-répertoires).     * ''recursive'' (parcourir les sous-répertoires).
-  * lien symbolique : +  * lien symbolique :
     * ''none'' (ne rien faire) ;     * ''none'' (ne rien faire) ;
     * ''copy_symlinks'' (copier les liens symboliques) ;     * ''copy_symlinks'' (copier les liens symboliques) ;
     * ''skip_symlinks'' (passer les liens symboliques).     * ''skip_symlinks'' (passer les liens symboliques).
-  * type de copie : +  * type de copie :
     * ''none'' (ne rien faire) ;     * ''none'' (ne rien faire) ;
     * ''directories_only'' (copier seulement les répertoires) ;     * ''directories_only'' (copier seulement les répertoires) ;
Ligne 284: Ligne 284:
 </code> </code>
  
-=== Suppression ===+==== Suppression ====
  
 <code cpp> <code cpp>
Ligne 291: Ligne 291:
 </code> </code>
  
-=== Renommer === +==== Renommer ====
  
 <code cpp> <code cpp>
Ligne 297: Ligne 297:
 </code> </code>
  
-=== Création des répertoires ou des liens symboliques ===+==== Création des répertoires ou des liens symboliques ====
  
 <code cpp> <code cpp>
Ligne 307: Ligne 307:
 </code> </code>
  
-La fonction hard_link_count permet de connaître le nombre de hard link d'un chemin :+La fonction ''hard_link_count'' permet de connaître le nombre de hard link d'un chemin :
 <code cpp> <code cpp>
 cout << hard_link_count("/home/me/file"); cout << hard_link_count("/home/me/file");
Ligne 318: Ligne 318:
 </code> </code>
  
-==== Fichier et répertoire temporaire ====+===== Fichier et répertoire temporaire =====
  
 Pour faciliter la création de fichiers temporaires, la fonction ''unique_path'' permet de créer un chemin qui n'existe pas, ce qui permet de créer un fichier sans supprimer ou modifier un fichier existant. Pour cela, la fonction prend une chaîne de caractères comme modèle et génère aléatoirement un nom de fichier. Les caractères ''%'' de la chaîne sont remplacés par une valeur hexadécimale. Par défaut, le modèle est ''"%%%%-%%%%-%%%%-%%%%"''. Pour faciliter la création de fichiers temporaires, la fonction ''unique_path'' permet de créer un chemin qui n'existe pas, ce qui permet de créer un fichier sans supprimer ou modifier un fichier existant. Pour cela, la fonction prend une chaîne de caractères comme modèle et génère aléatoirement un nom de fichier. Les caractères ''%'' de la chaîne sont remplacés par une valeur hexadécimale. Par défaut, le modèle est ''"%%%%-%%%%-%%%%-%%%%"''.
Ligne 325: Ligne 325:
 cout << unique_path() << endl; cout << unique_path() << endl;
     // peut générer par exemple : 25e9-a1f3-6b4b-671c     // peut générer par exemple : 25e9-a1f3-6b4b-671c
-    // 2^64 valeurs possibles  +    // 2^64 valeurs possibles 
-    +
 cout << unique_path("test-%%%%%%%%%%%.txt") << endl; cout << unique_path("test-%%%%%%%%%%%.txt") << endl;
     // peut générer par exemple : test-0db7f2bf57a.txt     // peut générer par exemple : test-0db7f2bf57a.txt
-    // 2^44 valeurs possibles +    // 2^44 valeurs possibles
 </code> </code>
  
c_1y_file_system.1394622323.txt.gz · Dernière modification: 2014/03/12 12:05 par gbdivers