Lister les fichiers d'un repertoire + filtres

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 039 fois - Téléchargée 17 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

Messages postés
562
Date d'inscription
samedi 10 janvier 2004
Statut
Membre
Dernière intervention
11 octobre 2010

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)
Messages postés
5
Date d'inscription
mardi 9 septembre 2008
Statut
Membre
Dernière intervention
26 avril 2009

je l'ai complilé et sa marche pas autant que sur windows xp que sue ubuntu 8.04 pourquoi?
Messages postés
562
Date d'inscription
samedi 10 janvier 2004
Statut
Membre
Dernière intervention
11 octobre 2010

Ok merci jtiendrais compte de ta remarque.
Messages postés
240
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
22 mars 2009

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.
Messages postés
562
Date d'inscription
samedi 10 janvier 2004
Statut
Membre
Dernière intervention
11 octobre 2010

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.
Afficher les 11 commentaires

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.