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 :

Parcourir un repertoire en récursif


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut Parcourir un repertoire en récursif
    Bonjour,

    Conséquent à une erreur inexpliquée, des milliers de fichiers ont été "corrompus" de la même manière.

    Il s'agit de quelques caractères à ajouter ou supprimer pour réparer cela. A la mano, bonjour le taff.

    Bref j'ai pondu une fonction qui parcourt un dossier de manière récursive.
    Je voulais avoir votre avis concernant sa "propreté".

    Voici la fonction en question et ci-après le code minimal d’exécution.

    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
     
    void browse_directory(DIR *directory, char *path)
    {
        directory = open_directory(path);                                   // Ouvrir le répertoire courant
        struct dirent *entity=NULL;                                         // Déclarer la structure de repertoire
        seekdir(directory,2);                                               // Déplacer le curseur de la structure du repetoire après . & ..
     
        while( (entity=readdir(directory)) != NULL  )                       // Tant que le repertoire courant n'a pas été entièrement parcouru
        {
            char *current_path = get_current_path(path, entity->d_name);    // On récupère le chemin de l'entité(fichier ou dossier) du repertoire courant
     
            if ( is_directory(current_path) != NULL )                       // Si l'entité est un dossier
            {
                printf("\nDOSSIER %s", current_path);                       
                browse_directory(directory, current_path);                  // Appel récursif de la fonction parcourir dossier
            }
     
            else printf("\nFILE %s", current_path);                         // Sinon c'est un fichier
        }
    }
    ______________________________________________________________

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <dirent.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <errno.h>
     
    #ifndef WIN32
        #include <sys/types.h>
        #define CLEAR "clear"
        /* system("clear") pour UNIX */
    #else
        #define CLEAR "cls"
        /* system("cls") pour Windows */
    #endif
     
    DIR *open_directory(char * path)
    {
        if ( opendir(path)==NULL )
            fprintf(stderr,"\nouverture dossier echoue : %s", path);
     
        return opendir(path);
    }
     
    void close_directory(DIR *directory)
    {
        if ( closedir(directory)==-1 )
            fprintf(stderr,"\fermeture dossier echouee");
     
        closedir(directory);
    }
     
    void read_directory(DIR *directory, char *path)
    {
        directory = open_directory(path);
        struct dirent *entity = NULL;
        while( (entity = readdir(directory)) != NULL )
        {
            printf("\n%s", entity->d_name);
        }
        close_directory(directory);
    }
     
    DIR *is_directory(char * path)
    {
        return opendir(path);
    }
     
    char *get_current_path( char* path, char *next)
    {
        char *current_path=(char*)malloc((strlen(path)+strlen(next)+2)*sizeof(char));
        int i;
        for (i=0; i<strlen(path);i++)
            current_path[i]=path[i];
     
        current_path[strlen(path)]='\\';
     
        for (i=strlen(path)+1; i<strlen(path)+strlen(next)+1;i++)
            current_path[i]=next[i-strlen(path)-1];
     
        current_path[strlen(path)+strlen(next)+1]='\0';
     
        return current_path;
    }
     
    void browse_directory(DIR *directory, char *path)
    {
        directory = open_directory(path);                                   // Ouvrir le répertoire courant
        struct dirent *entity=NULL;                                         // Déclarer la structure de repertoire
        seekdir(directory,2);                                               // Déplacer le curseur de la structure du repetoire après . & ..
     
        while( (entity=readdir(directory)) != NULL  )                       // Tant que le repertoire courant n'a pas été entièrement parcouru
        {
            char *current_path = get_current_path(path, entity->d_name);    // On récupère le chemin de l'entité(fichier ou dossier) du repertoire courant
     
            if ( is_directory(current_path) != NULL )                       // Si l'entité est un dossier
            {
                printf("\nDOSSIER %s", current_path);                       
                browse_directory(directory, current_path);                  // Appel récursif de la fonction parcourir dossier
            }
     
            else printf("\nFILE %s", current_path);                         // Sinon c'est un fichier
        }
    }
     
    int main (void)
    {
        char path[999]="C:\\Documents and Settings\\alv\\Mes documents";
        DIR* directory=NULL;
        browse_directory(directory,path);
        close_directory(directory);
        return 0;
    }

  2. #2
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Salut,

    Dans une optique de propreté, tu pourrais éviter de rappeler à de nombreuses la même fonction, avec les mêmes arguments (strlen, en l'occurrence), et utiliser une variable temporaire, pour ce faire. Après, tu as des fuites mémoires : quand tu appelles is_directory, tu ne récupères pas la valeur de retour, et le pointeur alloué n'est pas libéré par tes soins. N'oublie pas les fermetures de répertoire, donc.

    S'il s'agit de traiter chaque fichier trouvé, alors il serait bien d'exploiter le principe de callback.

    Bonne soirée.

  3. #3
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Salut,

    Ok pour strlen, censé.
    Je suis d'accord pour la fuite mémoire, à vrai dire j'ai eu la flemme d'écrire l'allocation et de le passer paramètre et désallouer derrière. Oui shame on me.
    Par contre, je ne comprends pas pourquoi tu dis que le résultat n'est pas renvoyé ?

    Cordialement.

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

Discussions similaires

  1. [Réseau] Parcourir un répertoire dans un site
    Par Space Cowboy dans le forum Langage
    Réponses: 3
    Dernier message: 15/09/2007, 07h43
  2. Parcourir un repertoire réseau avec droits
    Par filip24 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/07/2007, 16h38
  3. [VBA-E] Parcourir un repertoir et opérations sur fichiers xls
    Par anisr dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 08/03/2007, 16h48
  4. VBA/EXCEL/WORD parcourir sous repertoires
    Par jef35jef dans le forum VBA Word
    Réponses: 1
    Dernier message: 21/02/2007, 16h39
  5. Parcourir un répertoire avec un script
    Par dams78 dans le forum Linux
    Réponses: 7
    Dernier message: 13/12/2006, 21h09

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