Lister les répertoires et sous-répertoires

Présentation
Ce programme permet de lister les répertoires et les sous-répertoires ainsi que les fichiers qui y sont stockés.
Téléchargement
Compatibilité
Linux Mac Windows
0  0 
Téléchargé 101 fois Voir les 8 commentaires
Détails
Avatar de Benjamin Roux
Expert éminent sénior
Voir tous les téléchargements de l'auteur
Licence : Autre
Date de mise en ligne : 30 novembre 2010




Avatar de Psycho185 Psycho185 - Membre du Club https://www.developpez.com
le 02/02/2011 à 12:53
Sa marche nickel merci pour ce code j'en avais besoin pour un projet.
Avatar de pfeuh pfeuh - Membre éprouvé https://www.developpez.com
le 02/02/2011 à 13:29
Salut,

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

Code : Sélectionner tout
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 ===|
Avatar de bazzanella bazzanella - Futur Membre du Club https://www.developpez.com
le 03/11/2011 à 22:14
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,
Avatar de Melem Melem - Expert éminent https://www.developpez.com
le 04/11/2011 à 1:31
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.
Avatar de ctac_ ctac_ - Membre actif https://www.developpez.com
le 14/03/2016 à 23:10
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
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
Avatar de yvesberger yvesberger - Candidat au Club https://www.developpez.com
le 07/04/2016 à 22:07
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'.
Avatar de _-Slash-_ _-Slash-_ - Membre confirmé https://www.developpez.com
le 08/04/2016 à 21:38
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
1
2
3
4
5
 
#ifdef _WIN32 
SEPARATOR "\\" 
#else 
SEPARATOR "/"
Avatar de lregiany lregiany - Nouveau Candidat au Club https://www.developpez.com
le 03/08/2016 à 11:41
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
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.
Contacter le responsable de la rubrique C