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++Builder Discussion :

Lister des Répertoires d'un répertoire source


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut Lister des Répertoires d'un répertoire source
    Bonjour à tous !

    J'ai besoin de sortir la liste de tous les répertoires présents dans un répertoire, pour cela j'ai trouvé un code sur la FAQ que j'ai tenté d'adapter à mes besoins.

    Afin de vérifier que mon code fonctionne, j'écris dans un fichier txt les noms de dossiers qui sont censés être présents dans mon répertoire de base.

    Le hic, mon code ne fonctionne pas, j'ai surement dû oublier du code...alors si quelqu'un peut m'aider, ca serait gentil.

    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
    void Administration::CompareRoot()
    {
            String sourceRoot;
            TSearchRec sr;
     
            FILE *f;
     
            f = fopen("C:\\resultat.txt","w");
            sourceRoot = ObjGestionFichierINI->GetFichier("ConfigurationRoot","Source");
     
            if(FindFirst(sourceRoot,faDirectory,sr) == 0)
            {
                    do
                    {
                            ShowMessage(sr.Name);
                            fwrite(&sr.Name,sr.Name.Length(),1,f);
     
                    } while (FindNext(sr) == 0);
                    FindClose(sr);
     
            }
     
    }
    l'objet "ObjGestionFichierINI" me récupère dans un fichier ini, un chemin d'accès qui est censé être le chemin de base pour le répertoire de basE. Le chemin est bien remonté par l'objet.

    merci d'avance

  2. #2
    Membre éclairé Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    essai avec des TStringList, je pense que c'est plus facile a utiliser que les fopen et fwrite

    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
     
    Code :
    void Administration::CompareRoot()
    {
            AnsiString sourceRoot;
            TSearchRec sr;
            TStringList *List = new TStringList();
     
            sourceRoot = ObjGestionFichierINI->GetFichier("ConfigurationRoot","Source");
     
            if(FindFirst(sourceRoot,faDirectory,sr) == 0)
            {
                    do
                    {
                            ShowMessage(sr.Name);
                            List->Add(sr.Name);
     
                    } while (FindNext(sr) == 0);
                    FindClose(sr);
                    List->SaveToFile("C:\\resultat.txt");
            }
             List->Clear();
             delete List;
    }

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut
    j'y ai pensé, mais bien avant de coder des TStringList, j'ai ajouté mon showmessage, donc théoriquement, à chaque dossier trouvé, il doit m'afficher un ShowMessage avec le nom de dossier, et la il ne le fait pas...

    donc j'ai l'impression qu'il ne me renvoie que le nom du dossier source, etpas les dossiers contenus dans le dossier source.

  4. #4
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Avant d'aller lire dans un .ini, essaye peut être avec un chemin directement mis dans le code, voir si cela fonctionne comme ça.

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut
    Avec ou sans ini, ca donne le même résultat.

    Ex: Sur mon ini, j'ai ->C:\Windows, eh bien mon ShowMessage, me renvoie seulement "Windows" soit le nom du dossier de basE.Par contre j'ai aps les autres dossiers contenus.

    Si je tape en dur "C:\Windows\" ou "C:\\Windows", ca fait le même résultat que si j'utilise le fichier ini.

    donc j'en viens à me demander si mon code fonctionne au niveau du do-while. J'ai pas l'impression qu'il arrive à lire les répertoires

  6. #6
    Membre éclairé Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Par défaut
    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
            AnsiString sourceRoot;
            TSearchRec sr;
            TStringList *List = new TStringList();
    
            sourceRoot = "c:\\";
     
            if(FindFirst(sourceRoot+"*",faDirectory,sr) == 0)
            {
                    do
                    {
                            if( ((sr.Attr & faDirectory) ==  faDirectory) && sr.Name != "." && sr.Name != "..")
                            {
                                    ShowMessage(sr.Name);
                                    List->Add(sr.Name);
                            }
     
                    } while (FindNext(sr) == 0);
                    FindClose(sr);
                    List->SaveToFile("C:\\resultat.txt");
            }
             List->Clear();
             delete List;
    voila ce code fonctionne

    remplace le sourceroot par la donnée de ton ini

    sa doit etre de la forme c:\\Test\\

    dans le findfirst on ajoute * donc au final il faut passer c:\\Test\\* pour que la fonction fonctionne

    Cordialement Baxter

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut
    Ici dans ce code, si on met "C:\\" en sourceRoot, il va se limiter aux dossiers Windows;Progam Files etc...mais ne rentrera pas dans ces dossiers.

    Donc je suppose que si je veux aussi lire les sous répertoires, je dois effectuer une lecture récursive?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lister des fichiers dans un répertoire
    Par JD971 dans le forum Débuter
    Réponses: 8
    Dernier message: 21/06/2012, 11h02
  2. Réponses: 2
    Dernier message: 24/07/2009, 13h34
  3. Réponses: 0
    Dernier message: 09/04/2008, 11h03
  4. lister tous les fichiers avec des différences entre deux répertoires.
    Par contremaitre dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/03/2008, 15h24
  5. Lister des fichiers contenus dans un répertoire
    Par mithrendil dans le forum Langage
    Réponses: 5
    Dernier message: 01/05/2007, 09h27

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