IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

récursivité, lister les répertoires en C++


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut récursivité, lister les répertoires en C++
    Hello,
    Merci de me lire,
    excuser l'indentation des commentaires mai le copier coller déconne
    pour le bug c'est simple c'est expliquer aux début du fichier
    noter que je débute,depuis peux que je compile avec g++ j'utilise geany comme éditeur.
    ce code est fonctionnel hormis le fait qu'il ne fait pas ce que je veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    #include <iostream>
    #include <vector>
    #include <string>
    #include <dirent.h>
    #include <sys/stat.h>
    using std::string;
     
    /*
    Ce code est destiner a lister le plus rapidement possible.
    Les fichier et les répertoire sous linux.
    Avec leur attributs aux complet.(pas encore utiliser, ni coder)
    */
     
    /*
    Les répertoires ce présente comme ceci.
    note: remplacer le ~ par celui de votre utilisateur.
    mkdir -p ~/rep_racine/rep1
    mkdir -p ~/rep_racine/rep2/sous_rep_2_0
    mkdir -p ~/rep_racine/rep2/sous_rep_2_1
    mkdir -p ~/rep_racine/rep2/sous_rep_2_2
    mkdir -p ~/rep_racine/rep2/sous_rep_2_3
    mkdir -p ~/rep_racine/rep3 
    mkdir -p ~/rep_racine/rep2/sous_rep_2_3/sous_sous_rep2
    * 
    le dernier répertoire n'est pas trouver alors que ceux situer dans ~/rep_racine/rep2/ le son
    */ 
     
    void Full_Search(std::vector<string> &search_full_path, 
    std::vector<string> &search_rep_name, 
    std::vector<string> &search_file_name, 
    std::vector<string> &stat_info,std::string &transfere);												//Prototype Full_Search 
     
     
    void Full_Search(std::vector<string> &search_full_path,
    std::vector<string> &search_rep_name, 
    std::vector<string> &search_file_name, 
    std::vector<string> &stat_info, std::string &transfere)
    { 
     
    	long number_element;																			//déclaration, nombre d'element
    	std::string source_transfere;																	//déclaration, provisoire copie les donnée de la variable
    	source_transfere = transfere;																	
    	number_element = search_full_path.size() -1;
    		std::cout << "DEBUG ----------1: " << number_element << " :----------contien----------: "
    		 << search_full_path [number_element] << std::endl;
    	if (source_transfere != "")
    	{
    		std::cout << "DEBUG ----------2: " << number_element << " :----------contien----------: " 
    		<< search_full_path [number_element] << std::endl;
    		int cmb = source_transfere.length();
    		if (source_transfere.substr((cmb- 1), cmb) != "/")
    		{ 
    			source_transfere += "/";
    			std::cout << "DEBUG ----------3: source_transfere :----------contien----------: " 
    			<< source_transfere << std::endl;
    		}
    		DIR *InitialRep = opendir(source_transfere.c_str());
    		if (InitialRep != NULL)
    		{
    			struct dirent *SRep;
    			while ((SRep = readdir(InitialRep)) != NULL)											//tant que le répertoire contient des fichiers
    			{
    				string FileFound = SRep->d_name;													//definir le fichier (dernier répertoir trouver)
    				string PathFound = source_transfere + FileFound;									// chemin complet
    				if (FileFound != "." && FileFound != "..") 
    				{	
    					source_transfere = PathFound;
    						FileFound = FileFound + "/";
    						search_full_path.push_back(FileFound);
    						++number_element;
    						std::cout << "DEBUG ----------4: " << number_element << 
    						" :----------contien----------: " << FileFound << std::endl;
    						std::cout << "DEBUG ----------5: " << number_element << 
    						" :----------contien----------: " << search_full_path [number_element] 
    						<< std::endl;
    						if (opendir(PathFound.c_str()) != NULL)
    						{
    							std::cout << "DEBUG ----------6: " << number_element << 
    							" :----------contien----------: " << search_full_path [number_element] 
    							<< std::endl;
    							Full_Search(search_full_path, search_rep_name, 
    							search_file_name, stat_info, source_transfere);							//apelle recusif pour les sous répertoires bug ?
    							std::cout << "DEBUG ----------7: " << number_element 
    							<< " :----------contien----------: " << search_full_path [number_element] 
    							<< std::endl;
    						}
    				}
    				else																				//else uniquement pour le debugage,il est possible de le supprimer
    				{
    					std::cout << "DEBUG ----------8: " << number_element << 
    					" :----------contien----------: " << search_full_path [number_element] 
    					<< std::endl;
    					std::cout << "DEBUG ----------9: " << FileFound << std::endl;
    					std::cout << "DEBUG ----------10: " << transfere << std::endl;
    					std::cout << "DEBUG ----------11:: " << source_transfere << std::endl;
     
    				}
    			} //while
    		}
    		closedir(InitialRep);																		//fermer le repertoire courant
    	}
    }																									//function Full_Search
     
    int main()
    {
    																									//variable
    std::vector<std::string> search_full_path;															//retourne un tableau chemin complet de tout les répertoires trouver
    std::vector<std::string> search_rep_name; 															//repertoir seulement,pas encore utilisée
    std::vector<std::string> search_file_name;															//fichier seulement,pas encore utilisée
    std::vector<std::string> stat_info;																	//information global sur le répertoir ou le dossier,pas encore utilisée
    std::string transfere;																				//variable pour le nom du repertoir en recusiviter, passe en paramettre le répetoire racine.
     
    																									//code
     
    search_full_path.push_back("/home/taz/rep_racine/");												//valeur par defaut,en cour de dévloppment,rarement utiliser
    transfere = "/home/taz/rep_racine";
    Full_Search(search_full_path, search_rep_name, search_file_name, stat_info,transfere);
    std::cout << "nombre d'élément apres execution " << search_full_path.size() << std::endl;			//affiche le nombre d'entrée du tableau
    	for (long i = 0; i < search_full_path.size(); ++i ) 											//affiche le contenu du tableaux
        {
        	std::cout << search_full_path[i] << std::endl;
        }
    std::cout << "affichage terminer" << std::endl;
    return 0;
    }																									// main

  2. #2
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Tu devrais, au lieu d'avoir 3 conteneurs, n'en avoir qu'un qui contient une structure "Directory", qui elle même contient des conteneurs de fichiers ou de répertoires.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct Directory
    {
       std::list< Directory > directories;
       std::list< std::string > files;
    };
    Et ensuite un algorithme du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // pseudo-code
    récupérer le répertoire courant D
    pour chaque répertoire Dn trouvé dans D
       ajouter dans directories le répertoire Dn
       lancer une recherche sur Dn
    finpour
    pour chaque fichier trouvé F dans D
       ajouter F dans files
    finpour

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Encore plus pratique, c'est boost.Filesystem.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    je ne suis pas encore a l'aise avec les structures,mai je vai pas tarder a m'y mettre. merci pour tes conseil.

    Citation Envoyé par JulienDuSud Voir le message
    Tu devrais, au lieu d'avoir 3 conteneurs, n'en avoir qu'un qui contient une structure "Directory", qui elle même contient des conteneurs de fichiers ou de répertoires.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct Directory
    {
       std::list< Directory > directories;
       std::list< std::string > files;
    };
    Et ensuite un algorithme du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // pseudo-code
    récupérer le répertoire courant D
    pour chaque répertoire Dn trouvé dans D
       ajouter dans directories le répertoire Dn
       lancer une recherche sur Dn
    finpour
    pour chaque fichier trouvé F dans D
       ajouter F dans files
    finpour

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par poukill Voir le message
    Encore plus pratique, c'est boost.Filesystem.
    merci pour boost, cette lib est codée en C ou en C++ ?
    note je compte pas m'en servir je voudrai comprendre et apprendre le c++, ce petit programe, mine de rien demande pas mal de boulôt

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut
    Citation Envoyé par panthere noire Voir le message
    merci pour boost, cette lib est codée en C ou en C++ ?
    C'est une bibliothèque (car lib est l'abréviation du terme anglais library qui signifie en réalité... bibliothèque exclusivement codée en C++ pour être utilisée en C++.

    En effet elle manipule, entre autres, les template à grande échelle, ce qui la rend inutilisable en première ligne en C (qui ne les connait pas)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Lister les répertoires et leurs sous-répertoires, c'est ok
    Par ouskel'n'or dans le forum VBA PowerPoint
    Réponses: 1
    Dernier message: 17/08/2009, 09h59
  2. [OpenOffice][Base de données] Lister les répertoires et disques en VB Ooo
    Par Papy Octet dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 24/11/2008, 13h01
  3. lister les répertoires partagés
    Par koKoTis dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 03/12/2007, 18h01
  4. lister les répertoires et sous répertoire
    Par panthere noire dans le forum Linux
    Réponses: 7
    Dernier message: 27/12/2006, 13h29
  5. Lister les répertoires d'un répertoire
    Par Faith's Fall dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/02/2006, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo