begin process at 2012 02 05 05:00:58
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > LISTER LES FICHIERS D'UN REPERTOIRE + FILTRES

LISTER LES FICHIERS D'UN REPERTOIRE + FILTRES


 Information sur la source

Note :
Aucune note
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 :7 701

Auteur : yvesyves

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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

 Sources de la même categorie

Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel
Source avec Zip COPIE DE FICHIERS PAR RESEAU LOCAL par cczerty

 Sources en rapport avec celle ci

GESTION DE FICHIER ET DOSSIER + AUTRES par shinji63
Source avec Zip PROTEGER UN DOSSIER ET LES FICHIER A L INTERIEUR par f_l_a_s_h_b_a_c_k
UNIX : LISTER LE NOMBRE DE PROCESSUS TOURNANT SUR LA MACHINE par jojo930
Source avec Zip EXPLORATEUR DE FICHIER par kts_system
Source avec Zip GESTION DES PERSONNEL D'UNE ENTRPRISE EN UTILISANT LES LISTE... par abidou009

Commentaires et avis

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 :)

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 :)

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";

Commentaire de yvesyves le 19/11/2008 19:10:01

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

Commentaire de vincent7766 le 19/11/2008 23:47:33

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

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

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.

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.

Commentaire de yvesyves le 23/11/2008 21:13:11

Ok merci jtiendrais compte de ta remarque.

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?

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...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,792 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales