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

Télécharger C Discussion :

Lister les répertoires et sous-répertoires [Sources]


Sujet :

Télécharger C

  1. #1
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut Lister les répertoires et sous-répertoires
    Bonjour, Je vous propose un nouvel élément à utiliser : Lister les répertoires et sous-répertoires



    Ce programme permet de lister les répertoires et les sous-répertoires ainsi que les fichiers qui y sont stockés.



    Qu'en pensez-vous ?

  2. #2
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 71
    Points : 48
    Points
    48
    Par défaut
    Sa marche nickel merci pour ce code j'en avais besoin pour un projet.

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Chez moi, ça ne compile pas. Windows XP32 et Code::Blocks.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    C:\faller\languages\C\codeblocks\dummy\main.c||In function `lister':|
    C:\faller\languages\C\codeblocks\dummy\main.c|28|error: structure has no member named `d_type'|
    C:\faller\languages\C\codeblocks\dummy\main.c|28|error: `DT_DIR' undeclared (first use in this function)|
    C:\faller\languages\C\codeblocks\dummy\main.c|28|error: (Each undeclared identifier is reported only once|
    C:\faller\languages\C\codeblocks\dummy\main.c|28|error: for each function it appears in.)|
    ||=== Build finished: 4 errors, 0 warnings ===|

  4. #4
    Futur Membre du Club
    Homme Profil pro
    adminsys
    Inscrit en
    Octobre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : adminsys

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3
    Points : 9
    Points
    9
    Par défaut dirent.h
    Bonsoir,
    merci pour le partage de ce programme pour la communauté.

    Tu devrais spécifier, à mon avis, que si l'on compile sous environnement Linux, il faut comme le stipule le header dirent.h, de mettre le 2ième define (__USE_BSD) avant les inclusions :

    #define _GNU_SOURCE
    #define __USE_BSD
    #include <stdio.h>
    .......

    Ce 2ième define est nécessaire à la compilation du programme sous GNU/Linux. Sans lui, la variable DT_DIR (qui vaut 4 si je me souviens), n'est pas déclarée.

    Tu peux également stipuler en début du programme ceci :

    /* ISO C90 */

    Ce code étant conforme au C90.

    Cordialement,

  5. #5
    Expert éminent
    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 : 38
    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
    Points : 8 389
    Points
    8 389
    Par défaut
    La syntaxe est conforme au C90 mais les fonctions utilisées non. POSIX.1 n'exige pas non plus l'existence du champ d_type dans la structure dirent, ce champ n'existe que dans le systèmes BSD et certaines implémentations plus ou moins compatibles (le seul champ exigé par POSIX est le champ d_name). Du coup, on a plutôt affaire ici à une source BSD. Si on veut se conformer au standard POSIX, on utilisera stat à la place du champ d_type.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Je cherchais a lister fichiers et répertoires.
    J"ai trouvé ce code mais, dommage, ça ne fonctionne ni sur windows, ni sur linux car, entre autre, le path-separator n'est pas géré.
    Je propose ce code en remplacement.
    Qu'en pensez vous ?
    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
    127
    128
    129
    130
    #include <stdio.h>
    #include <string.h>
    #include <dirent.h>
    #include <unistd.h>
     
    char *separatorpath(char *sep)
    {
        char lepath[256], *monpath;
        monpath = getcwd(lepath, 256);
        if(! (monpath == lepath))
            return NULL;
        if(monpath[0] == '/')                       // NIX
            return strcpy(sep,"/");
        if((*strchr(monpath, '\\') == monpath[2]))  // WIN
            return strcpy(sep,"\\");
        return NULL;
    }
     
    void usage(char *name)
    {
       printf("Usage : %s [directory]\n", name);
    }
     
    int lister(const char *ladir, const char *sep_path, const size_t sizebuff)
    {
        DIR *dir = NULL;
        struct dirent *file = NULL;
        char *filename, *cherche, directory[sizebuff], newdir[sizebuff], dirwin[3];
        static int tab;
        int tabfin, tabdebut, lendir;
     
        strcpy(directory, ladir);
        cherche = directory;
        lendir = strlen(directory);
        cherche += lendir -1;
        if(! strcmp(cherche, sep_path))
        {
            tab = 0;
            for(;;)
            {
                if(lendir == 1)     // cas de la racine NIX "/"
                    break;
                if(lendir == 3)     // cas de la racine WIN "C:\"
                {
                    strcpy(dirwin,":");
                    strcat(dirwin, sep_path);
                    if(! strcmp(&directory[1], dirwin))
                        break;
                }
                *cherche = '\0';
                break;
            }
        }
        if((dir = opendir(directory)) == NULL)
            return 1;
        tabdebut = tabfin = ++tab;
        while(--tabdebut > 0)
            printf("\t");
        printf("debut %s\n", directory);
        if(tabfin < 5)  // limitation de l'affichage
        {
            while((file = readdir(dir)) != NULL)
            {
                filename = file->d_name;
                if(strcmp(filename, ".") && strcmp(filename, ".."))
                {
                    if((lendir + strlen(sep_path) + strlen(filename)) >= sizebuff)
                    {
                        printf("buffer trop petit : %d\n", (int) sizebuff);
                        return -1;
                    }
                    strcpy(newdir,directory);
                    cherche = newdir;
                    cherche += lendir -1;
                    if(strcmp(cherche, sep_path))
                        strcat(newdir, sep_path);
                    strcat(newdir,filename);
                    switch (lister(newdir, sep_path, sizebuff))
                    {
                    case 1:     // fichier
                        tabdebut = tabfin;
                        while(tabdebut-- > 0)
                            printf("\t");
                        printf("%s\n", filename);
                        break;
                    case -1:    //buffer trop petit
                        return -1;
                        break;
                    case 0:     // repertoire
                        break;
                    }
                }
            }
        }
        while(--tabfin > 0)
            printf("\t");
        printf("fin %s\n", directory);
        tab--;
        closedir(dir);
        return 0;
    }
     
    int main(int argc, char **argv)
    {
        size_t sizebuff = 256, sizedir;
        char directory[sizebuff], path_separator[2], *cherche;
     
        if(argc != 2)
        {
            usage(argv[0]);
            return 1;
        }
        sizedir = strlen(argv[1]);
        if(sizedir >= sizebuff - 1)
        {
            printf("buffer trop petit : %d\n", (int) sizebuff);
            return -1;
        }
        strcpy(directory, argv[1]);
        cherche = directory;
        cherche += sizedir - 1;
        if(separatorpath(path_separator) == NULL)
        {
            printf("impossible de déterminer le path separator\nabandon\n");
            return -1;
        }
        if(strcmp(cherche, path_separator))
            strcat(directory, path_separator);
        return lister(directory, path_separator, sizebuff);
    }
    Cordialement,

    ctac

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Réponse / ton code
    Bonjour ctac,

    Personnellement, je trouve ton code très bien. Je t'en remercie ! Sans cet exemple je restais bloqué à ne pas savoir faire.
    Moi qui suis en suis toujours resté à un niveau très moyen en C, je le comprends bien et donc suis capable de l'adapter à mes besoins. Et au moins lui compile parfaitement avec codeblocks/MingW sous windows10 !

    En effet, comme toi, je n'arrivais pas à compiler les autres bouts de code de la page.

    Je trouve cela bien dommage, voir décevant, même si cela doit s'expliquer logiquement, mais cela n'arrive pas que sur ce site que par ailleurs j'apprécie beaucoup : les exemples fournis avec boost (sauf erreur, tut4.cpp) sur l'utilisation de l'include filesystem ne compilent pas non plus sur ma config restée totalement "d'origine'.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ctac_ Voir le message
    Bonjour,
    Je cherchais a lister fichiers et répertoires.
    J"ai trouvé ce code mais, dommage, ça ne fonctionne ni sur windows, ni sur linux car, entre autre, le path-separator n'est pas géré.
    Pourquoi ne pas définir une macro dans ce style ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #ifdef _WIN32
    SEPARATOR "\\"
    #else
    SEPARATOR "/"

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    Region
    Inscrit en
    Août 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Region
    Secteur : Service public

    Informations forums :
    Inscription : Août 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut lister les repertoires et sous-répertoires
    Ce programme permet de lister les répertoires et les sous-répertoires ainsi que les fichiers qui y sont stockés.



    Qu'en pensez-vous ?[/QUOTE]

    Question:
    Bonjour,
    comment lancer ce programme?
    Je cherche à récupérer le résultat dans un fichier Excel avec les propriétés des fichiers type date de création de modification + son chemin.
    Merci bien

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/04/2008, 22h59
  2. Réponses: 1
    Dernier message: 30/10/2007, 10h21
  3. Réponses: 7
    Dernier message: 06/09/2007, 14h18
  4. lister les répertoires et sous répertoire
    Par panthere noire dans le forum Linux
    Réponses: 7
    Dernier message: 27/12/2006, 14h29

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