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 :

Lister le contenu d'un repertoire recursivement


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 18
    Par défaut Lister le contenu d'un repertoire recursivement
    Bonjour durant un projet j'ai besoin de lister le contenu d'un repertoire recursivement c-à-d lister le contenu du repertoire et des sous repertoires ...etc. Donc j'ai fait la fonction suivante
    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
     
    void read_dir(char *rep)
    {
      struct dirent *dirt = malloc(sizeof (struct dirent));
      DIR              *d;
      struct stat *st = malloc(sizeof(struct stat));
     
     d= opendir (rep);
     readdir(d);  //afin d'echaper au . et ..
     readdir(d);
     printf("%s\n", argv);
     while ((dirt = readdir(d))
     { 
      stat(dirt->d_name, st);
      if (S_ISDIR(st->st_mode))
        read_dir(dirt->d_name);
      else
         printf("%s\n", dirt->d_name);
     }
     closedir(d);
    }
    Mais mon probléme c'est a partir d'un certain moment il ne rentre plus dans les repertoire et je comprend pas pk ? quelqu'un pourrait m'aider en m'expliquand le probléme si possible ? ou en me donnant une autre solution ?


    Merci
    Bonne fin de journée





    " Mieux vaut tar que gz :p "

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 487
    Par défaut
    Citation Envoyé par naruto_dz Voir le message
    Bonjour durant un projet j'ai besoin de lister le contenu d'un repertoire recursivement c-à-d lister le contenu du repertoire et des sous repertoires ...etc. Donc j'ai fait la fonction suivante
    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
     
    void read_dir(char *rep)
    {
      struct dirent *dirt = malloc(sizeof (struct dirent));
      DIR              *d;
      struct stat *st = malloc(sizeof(struct stat));
     
     d= opendir (rep);
     readdir(d);  //afin d'echaper au . et ..
     readdir(d);
     printf("%s\n", argv);
     while ((dirt = readdir(d))
     { 
      stat(dirt->d_name, st);
      if (S_ISDIR(st->st_mode))
        read_dir(dirt->d_name);
      else
         printf("%s\n", dirt->d_name);
     }
     closedir(d);
    }
    Mais mon probléme c'est a partir d'un certain moment il ne rentre plus dans les repertoire et je comprend pas pk ? quelqu'un pourrait m'aider en m'expliquand le probléme si possible ? ou en me donnant une autre solution ?
    Merci
    Bonne fin de journée
    " Mieux vaut tar que gz :p "

    Peux tu poster tout le code ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 18
    Par défaut
    Ben j'ai juste un main qui appel cette fonction avec son argv

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(int argc, char *argv)
    {
     if (argc == 1)
         return (-1);
      read_dir(argv[2]);
      return (0);
    }
    c juste ce que j'ai


    Merci

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Ton algorithme est bon mais mal écrit en C. A part ça, t'as vraiment besoin de voir ton cours sur les pointeurs et l'allocation dynamique de mémoire, tu utilises très très mal malloc, qui est d'ailleurs inutile ici. Voici une version réussie de ton programme (que j'ai tout simplement repris). J'ai introduit la notion de niveau (level) pour améliorer l'affichage
    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
    #include <stdio.h>
    #include <dirent.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <stdarg.h>
     
    void read_dir(const char * rep, int level);
    void print(int level, const char * format, ...);
     
    int main(int argc, char * argv[])
    {
        if (argc == 2)
            read_dir(argv[1], 0);
        else
            printf("usage : read_dir <rep>.\n");
     
        return 0;
    }
     
    void read_dir(const char * rep, int level)
    {
        struct dirent * de;
        DIR * d;
        struct stat st;
     
        if ((d = opendir(rep)) != NULL)
        {
            chdir(rep); /* On travaille dans ce repertoire */
     
            /* Passer . et .. */
     
            readdir(d);
            readdir(d);
     
            /* Go */
     
            while ((de = readdir(d)) != NULL)
            {
                stat(de->d_name, &st);
     
                if (S_ISDIR(st.st_mode)) /* Si de est un repertoire */
                {
                    print(level, "%s (REP)\n", de->d_name); /* On affiche son nom */
                    chdir(rep); /* On revient la d'ou l'on venait */
                    read_dir(de->d_name, level + 1); /* On entre a l'interieur */
                }
                else
                    print(level, "%s\n", de->d_name);
            }
     
            closedir(d);
        }
    }
     
    void print(int level, const char * format, ...)
    {
        int i;
        va_list args;
     
        for(i = 0; i < level; i++)
            printf("  ");
     
        va_start(args, format);
        vprintf(format, args);
        va_end(args);
    }

Discussions similaires

  1. Lister le contenu d'un repertoire
    Par dert72 dans le forum Langage
    Réponses: 6
    Dernier message: 15/11/2006, 18h24
  2. Lister le contenu d'un repertoire
    Par red210 dans le forum C++
    Réponses: 18
    Dernier message: 13/07/2006, 15h05
  3. Lister le contenu d'un repertoire dans un ListBox
    Par MonsieurK dans le forum Access
    Réponses: 5
    Dernier message: 13/07/2006, 11h18
  4. Comment lister le contenu d'un repertoire
    Par jeff&&php dans le forum Langage
    Réponses: 17
    Dernier message: 31/05/2006, 11h29
  5. [debutant] lister le contenu d'un repertoire
    Par azrael88370 dans le forum Débuter
    Réponses: 5
    Dernier message: 12/01/2006, 14h00

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