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 :

[C++/POSIX] Fonction r�cursive pour lister des fichiers


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Inscrit en
    D�cembre 2005
    Messages
    225
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 225
    Par d�faut [C++/POSIX] Fonction r�cursive pour lister des fichiers
    Salut tous ,

    je voulais faire une fonction r�cursive en C++ permettant de lister les fichirs d'un r�p�rtoire ainsi que ses sous r�p�rtoires , alors j'ai �cris ce code C++ :
    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
    void list_dir( 
      const std::string & n_dossier
    ){
    	struct dirent *a;
    	DIR *dir;
    	dir = opendir(n_dossier.c_str());
    	while ((a = readdir(dir)))
    	{
            std::cout << a->d_name << std::endl;
    		if(!opendir(a->d_name)){
    			std::cout << a->d_name << std::endl;
    		} else {
    			std::cout << "<" << a->d_name << ">" << std::endl;
                            list_dir(a->d_name);
    		}
    	}
    	closedir(dir);
    }
    Mais il ne marche pas , beh il se compile bien mais j'ai un r�sultat inattendu , parfois �a n'affiche qu'un seul fichier , parfois �a donne plein de points , et parfois �a donne un message d'erreur avec Runtime ...

    Pourriez vous m'aider � r�soudre mon probl�me ?

    Merci beaucoup d'avance .

  2. #2
    Membre chevronn�
    Avatar de joellel
    Profil pro
    Inscrit en
    F�vrier 2003
    Messages
    234
    D�tails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : F�vrier 2003
    Messages : 234
    Par d�faut
    Attention, readdir() n'est pas r�entrante, tu dois perdre une valeur en cours de route!
    Essaie avec readdir_r() pour voir...

  3. #3
    Membre confirm�
    Inscrit en
    D�cembre 2005
    Messages
    225
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 225
    Par d�faut
    Salut
    readdir_r n'existe pas .
    Mais j'ai un peu avanc� m�me si �a n'affiche pas toujours l'arborescence compl�te...
    Voil� ce que j'ai essay� :
    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
    #include <stdio.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <iostream>
    #include "conio.h"
     
    void list_dir( 
      const std::string & n_dossier
    ){
    	struct dirent *a;
    	DIR *dir;
    	dir = opendir(n_dossier.c_str());
    	while ((a = readdir(dir)))
    	{
    		if(!opendir(a->d_name)){
    			std::cout << a->d_name << std::endl;
    		} else {
    			std::cout << "<" << a->d_name << ">" << std::endl;
                list_dir(n_dossier+"/"+a->d_name);
    		}
    	}
    	closedir(dir);
    }
     
    int main(void){
        std::string dossier;
        std::cout << "Dossier : ";
        std::cin >> dossier;
        list_dir(dossier);
        getch();
    }
    S'il vous plait essayez mon code et dites moi ce qui ne va pas avec lui...

    Merci beaucoup beaucoup d'avance .

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    � mon avis, readdir EST PLUS OU MOINS r�entrante, du moment qu'on utilise des descripteurs s�par�s...

    Le probl�me, c'est que bouazza92 ouvre des descripteurs sans les fermer...
    Et aussi, tu dois peut-�tre m�moriser les informations de ta dirent autre part avant de rappeler opendir()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirm�
    Inscrit en
    D�cembre 2005
    Messages
    225
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 225
    Par d�faut
    Salut ,

    voil� ma fonction fonctionne bien � part quelle produit une boucle infinie si le chemin donn� est .. ou . car si c'est un chemin relatif , la liste des chemins contient . et .. et ma fonction r�cursive les suit � chaque fois car ils sont des repertoires d'apr�s le test if(opendir((chemin+a->d_name).c_str())) et biens�r �a ne finira jamais , d'ailleurs je ne comprends pas pourquoi le test if(a->d_name==".." && a->d_name==".") ne fonctionne pas :S , si quelqu'un a une id�e sur mon probl�me , qu'il m'en fait savoir , voil� mon code source C++ ( non compilable avec un compilateur C ! ) :
    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
    void list_dir( 
      const std::string & n_dossier
    ){
    	struct dirent *a;
    	DIR *dir;
    	std::string chemin;
    	char chemin_c;
    	chemin=n_dossier;
    	chemin=str_replace("\\","/",chemin);
    	if(chemin.substr(chemin.size()-1,1)!="/") chemin.insert(chemin.size(),"/");
    	dir = opendir(chemin.c_str());
    	while ((a = readdir(dir)))
    	{
            if(a->d_name==".." && a->d_name=="."){} else {
    		if(opendir((chemin+a->d_name).c_str())){
                std::cout << "<" << a->d_name << ">" << std::endl;
                list_dir(chemin+a->d_name);
    		} else {
    		    std::cout << a->d_name << std::endl;
    		}
            }
    	}
    	closedir(dir);
    }
    Merci beaucoup beaucoup d'avance .

    EDIT :

    J'oubliais de poster le code de ma fonction str_replace , le voici :
    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
    std::string str_replace(
    	std::string motif,
    	std::string remplacement,
    	std::string chaine
    ){
    	std::string sortie;
    	sortie=chaine;
    	for(int i=0;i<chaine.size();i++){
    		if(chaine.substr(i,motif.size())==motif){
    			sortie.erase(i,i+motif.size());
    			sortie.insert(i,remplacement.c_str());
    		}
    	}
    	return(sortie);
    }

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    strcmp() ou une comparaison de strings: Les char* ne sont pas directement comparables...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirm�
    Inscrit en
    D�cembre 2005
    Messages
    225
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2005
    Messages : 225
    Par d�faut
    Sinon , auriez vous une solution pour transformer un chemin relatif en un chemin absolu ?
    Merci d'avance .

Discussions similaires

  1. R�ponses: 1
    Dernier message: 25/02/2009, 09h44
  2. R�ponses: 1
    Dernier message: 15/10/2008, 17h56
  3. Fonction r�cursive pour traitement des fichiers
    Par Montor dans le forum Contribuez
    R�ponses: 6
    Dernier message: 29/09/2008, 07h45
  4. [D�butante]requete pour lister des fichiers?
    Par bouba83 dans le forum Access
    R�ponses: 8
    Dernier message: 18/05/2006, 16h58
  5. Boucle en Dos pour lister des fichiers selon une date
    Par Corben dans le forum Autres Logiciels
    R�ponses: 1
    Dernier message: 17/12/2005, 12h17

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