Lister les fichiers d'un repertoire + filtres

0/5 (11 avis)

Snippet vu 14 919 fois - Téléchargée 19 fois

Contenu du snippet

Programmé sous Linux. Compatible windows.

Liste les fichiers d'un répertoire come indiqué dans le titre grâce à la bibliothèque dirent.h

Modes :
-Récursif (sous répertoires)
-Affichage des fichiers cachés (qui commencent par un point)
-Filtre d'extensions (n'affiche que les fichiers à l'extension spécifiée)
-Tri dichotomique desactivé croissant ou décroissant
-Affichage des fichiers/ répertoires, fichiers seulement, répertoires seulement.

Utilisation : voir main()

Ouvert à toutes critiques constructives. Ceci est ma première source en C++ je viens de VB.NET xD.

Ptite question : Pour créer une classe est t'on obligé d'avoir un fichier d'entete .h et un fichier source ou peut on tout regroupé dans le fichier d'entete afin que le fichier soit plus exportable?

Source / Exemple :


/*

Name : DEMIRDJIAN Yves
Date : 15/11/2008
Version : 1.0
Type : C++

  • /
#include <iostream> #include <vector> #include <string> #include <dirent.h> using namespace std; namespace ListAllFiles { struct ListFiles_Opts { ListFiles_Opts() //Valeurs par défaut { Recurs = false; Sort = 0; Type = 2; FiltrExt = "*"; WithHiddenFiles = false; } bool Recurs; //Analyser les sous répertoires? short int Sort; // Pas de tri : Sort=0, Tri croissant : Sort = 1, Tri decroissant : Sort = 2 !!!Attention : tri ASCII short int Type; //Tout : Type=2, Fichier : Type=1, Répertoire : Type=0 string FiltrExt; //Fichiers a extensions. Une seule extension "*" Pour tout afficher ou laisser la chaine vide. Exemple FiltrExt="mp3". bool WithHiddenFiles; //La recherche inclus les fichiers cachés }; //ListFiles_Opts bool FiltreFile(string &Name, ListFiles_Opts Opts) { //le nom est suposé être non nul étant donné qu'un fichier de nom de fichier vide ne peut exister if (Opts.WithHiddenFiles == false && Name[0] == '.') return false; if (Opts.FiltrExt.empty() || Opts.FiltrExt == "" ||Opts.FiltrExt == "*") return true; //trouver le point, le point ne peut être en position 0 ou en dernier position int Pos = Name.length() - 2; while (Pos > 0) { if (Name[Pos] == '.') break; --Pos; } if (Pos <= 0) return false; //trouver l'extension. Les '/' du filtre permette une recherche directe avec mot entier sans mélanger 2 extensions string Ext = Name.substr(Pos + 1, Name.length() - Pos - 1); if (Opts.FiltrExt == Ext) return true; return false; } void InsertElemSorted(vector<string> &Vec, string &Elem, short int SortType) { //********************* //Dochotomie insertion //********************* if (SortType == 0 || Vec.empty()) { Vec.push_back(Elem); } else //if(!Vec.empty()) { int Deb = 0; int Fin = Vec.size() - 1; int Pos; if (SortType == 1) //Tri croissant { while (Deb <= Fin) { Pos = Deb + (Fin - Deb) / 2; if (Elem > Vec[Pos]) { Deb = Pos + 1; } else { Fin = Pos - 1; } } } else //SortType == 2, tri décroissant { while (Deb <= Fin) { Pos = Deb + (Fin - Deb) / 2; if (Elem < Vec[Pos]) { Deb = Pos + 1; } else { Fin = Pos - 1; } } } vector<string>::iterator it = Vec.begin(); it += Deb; Vec.insert(it, Elem); } } //InsertElemSorted void ListFilesRec(string Path, vector<string> &Out, ListFiles_Opts Opts) { //vérification du formattage du chemion d'accès pour une bonne cohérence if (Path[Path.length() - 1] != '/') Path += "/"; //Parcours du répertoire DIR *InitialRep = opendir(Path.c_str()); if (InitialRep != NULL) { struct dirent *SRep; while ((SRep = readdir(InitialRep)) != NULL) //tant que le répertoire contient des fichiers { //definir le chemin d'acces complet string FileFound = SRep->d_name; string PathFound = Path + FileFound; //ajouter au vecteur mais selon le filtre et les options choisies if (FiltreFile(FileFound, Opts)) { if (Opts.Type == 2) { InsertElemSorted(Out, PathFound, Opts.Sort); } else { if (!((bool (Opts.Type)) ^ (opendir(PathFound.c_str()) == NULL))) InsertElemSorted(Out, PathFound, Opts.Sort); //On vérifie le type (fichier/repertoire) et selon les option on insere l'élément } } //si recursivité dans les sous répertoires, analyser le repertoire if (Opts.Recurs && FileFound != "." && FileFound != "..") ListFilesRec(PathFound + "/", Out, Opts); } //fermer le repertoire courant closedir(InitialRep); } } //ListFilesRec } //Namespace ListAllFiles int main() { vector<string> MaListFics; //Ma liste de fichiers de sortie ListAllFiles::ListFiles_Opts MesOpts; //Ma structure option //Paramètres que je veux MesOpts.WithHiddenFiles = false; MesOpts.Recurs = false; MesOpts.Sort = 1; MesOpts.Type=0; MesOpts.FiltrExt ="*"; //On lance tout ca ListAllFiles::ListFilesRec("/home", MaListFics, MesOpts); //Changer le chemin du répertoire ici. //On affiche (cela peut prendre un petit temps supplémentaire) cout << "Terminé." << endl << "Pressez une touche..." << endl; getchar(); for (unsigned u = 0; u < MaListFics.size(); ++u) { cout << MaListFics[u] << endl; } return 0; } //main

A voir également

Ajouter un commentaire Commentaires
cs_yvesyves Messages postés 561 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 11 octobre 2010
27 avril 2009 à 14:47
Dans la recherche du point pour le filtre par extension on peut remplacer tout un ptit bout de code par la méthode string.find_last_of(char)
ge0fy5 Messages postés 5 Date d'inscription mardi 9 septembre 2008 Statut Membre Dernière intervention 26 avril 2009
26 avril 2009 à 15:55
je l'ai complilé et sa marche pas autant que sur windows xp que sue ubuntu 8.04 pourquoi?
cs_yvesyves Messages postés 561 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 11 octobre 2010
23 nov. 2008 à 21:13
Ok merci jtiendrais compte de ta remarque.
cs_omnia Messages postés 240 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 22 mars 2009
23 nov. 2008 à 11:17
bonjour,

pour la remarque des class, pas forcément dans le fonctionnement actuel aucun intérêt de faire des class.
Il faut absolument que les pro C++ arrête de voir des class partout!!!

Dans le contexte actuel ce code devrait être adapté en C (car mis à part l'utilisation de librairies, et de codage...) ce code ne gagne rien à être fait en C++ surtout si ce code s'oriente performance et linux.

bon codage.
cs_yvesyves Messages postés 561 Date d'inscription samedi 10 janvier 2004 Statut Membre Dernière intervention 11 octobre 2010
23 nov. 2008 à 11:01
Normal il marque terminé quand il a fini de recenser tous les chemins d'accès. Ensuite il les affiche. Change le répertoire "/home" dans main() par "/". Je suis encore mal à l'aise avec les classes ^^ ça viendra.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.