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 ?
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 ?
Sa marche nickel merci pour ce code j'en avais besoin pour un projet.
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 ===|
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,
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.
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 ?
Cordialement,
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); }
ctac
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'.
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 "/"
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
Partager