Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LISTER LES FICHIERS D'UN REPERTOIRE + FILTRES


Information sur la source

Catégorie :Fichiers / Disque Classé sous : fichier, repertoire, dossier, lister, liste Niveau : Débutant Date de création : 16/11/2008 Date de mise à jour : 19/11/2008 22:07:35 Vu : 3 163

Note :
Aucune note

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note


Description

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

  • /*
  • 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
/*

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

Historique

19 novembre 2008 22:04:41 :
commentaire
19 novembre 2008 22:07:35 :
commentaire

Commentaires et avis

signaler à un administrateur
Commentaire de omnia le 16/11/2008 17:54:29

Bonjour, code intéressant car linux et librairie compatible multiple OS.
niveau code domage les librairies :
#include <iostream>
#include <vector>
#include <string>

qui sont des usines à gaz ^^

une gestion en char aurait été plus performante.

bon codage :)

signaler à un administrateur
Commentaire de yvesyves le 16/11/2008 18:31:50

Heu oui sûrement mais ca ne le serait pas plus si je fait des tableaux et des NTCTS, j'imagine la gestion... Il faut que j'évite d'utiliser ces librairies pour les prochaines fois sinon dans quel cas les utiliser? Merci :)

signaler à un administrateur
Commentaire de vincent7766 le 19/11/2008 06:15:47

Quel librairie de remplacement pourrait on remplacer
#include <iostream>
#include <vector>
#include <string>
?
Je crois aussi que pour être compatible linux il ne faut pas utiliser using namespace std;

mais écrire plutôt
std::string maString = "Voilà ma string";

signaler à un administrateur
Commentaire de yvesyves le 19/11/2008 19:10:01

Sisi ca marche^^ puisque j'ai programmé ce programme sous Ubuntu.

signaler à un administrateur
Commentaire de vincent7766 le 19/11/2008 23:47:33

Good, quelqu'un m'avait dit le contraire xD

signaler à un administrateur
Commentaire de roidestenebres le 23/11/2008 00:51:26

pendant la compilation il ne donne aucune erreur mais ds la console d'execution  il s'affiche Terminer appuyer sur une touche ,     une autre remarque c mieux de passer par des classes que des structures

signaler à un administrateur
Commentaire de yvesyves le 23/11/2008 11:01:24

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.

signaler à un administrateur
Commentaire de omnia le 23/11/2008 11:17:31

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.

signaler à un administrateur
Commentaire de yvesyves le 23/11/2008 21:13:11

Ok merci jtiendrais compte de ta remarque.

signaler à un administrateur
Commentaire de ge0fy5 le 26/04/2009 15:55:50

je l'ai complilé et sa marche pas autant que sur windows xp que sue ubuntu 8.04 pourquoi?

signaler à un administrateur
Commentaire de yvesyves le 27/04/2009 14:47:36

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)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

repertoire, dossier, fichier et disc dur ... [ par zinotron ] je souhaite devellopper un prog ki soit capable de me donner le meme resultat que la commande tree (MS-DOS) mais qui soit portable (cad sans findnextf lister une arborescence de repertoire [ par krater ] bonjour, je souhaite réaliser un programme en C sous unix/linux qui rentre dans un fichier texte la liste des fichier du repertoir passer en parametre Pb urgent - Parcourir un repertoire et lister les fichier - besoin d'aide [ par eupeup ] Bonjour a tous, je suis en super galere, je suis sur un proj, mais je bug grave sur un ptit module de rien du tout, et la j'en peux plus... Je suis s lister les fichier d'un répertoire [ par graall ] Bonjour, j'aimerais pouvoir lister les fichiers pr&#233;sents dans un r&#233;pertoire et avoir le r&#233;sultat sous forme de tableau. (repertoire[0] Fonction _chdir () c++ [ par Sn00bino_roi_du_petrol ] Bonjour,Je realise un programme qui consiste a lister les fichiers du repertoire que je veux.Mais je n' arrive pas a imposer ma volont&#233;:si je tap Récuperer la date d'un Fichier/Dossier !!! [ par champista ] Chalut,Je suis a la recherche d'une fonction pour recuperer la date d'un fichier ou d'un dossier afficher dans une listview (en MFC) .Je ve afficher e recherche fichiers executables et comparaisons [ par limsa033 ] Bonsoir,je cherche à lister tous les fichiers executables d(un disque dur ainsi que leur principales caractéristiques(nom,chemin et taille et date de GetSize mais pour un dossier [ par shadow1779 ] Bonjour, on m'a appris a utiliser GetFileSize pour recevoir la taille d'un fichier, y a til une fonction de l'api ou dans les libc standard afin d'av [MFC]Ouvrir un fichier de destination... [ par SyN42 ] Bonjour, Je cherche l'&#233;quivalent du : CFileDialog Browse(FALSE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "text Files (*.txt)|*.txt||") lister les fichiers dans un dossier [ par shadow1779 ] voila j'aimerai savoir comment faire pour lister les fichiers present dans un dossier si cela est possible en C.


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.