bonjour,
je parcours une arborescence de fichiers et je mets le fichier ou le dossier courant dans une struct dirent, comment savoir si le dirent courant est un fichier ou un dossier ?
Version imprimable
bonjour,
je parcours une arborescence de fichiers et je mets le fichier ou le dossier courant dans une struct dirent, comment savoir si le dirent courant est un fichier ou un dossier ?
Voir stat et la macro S_ISDIR ou S_ISREG
le dirent est généré par l'appel de la fonction readdir(DIR ). Dans cette structure, il y a : ino_t d_ino, off_t d_off, unsigned short d_reclen, char d_name[1]. Qu'est-ce que sont les d_ino,d_off et d_reclen ? car j'ai vu que les dossiers avaient un d_reclen = 16 et les fichiers txt = 28, y aurait-il un lien entre d-reclen et type de fichier ?
Issu du fichier dirent.h
Tu n'as pas le choix, il faut utiliser les fonctions et macros du fichier stat.h, c'est fait pour ça.Citation:
`d_reclen' member that gives the size of the entire directory entry.
j'essaie d'utiliser stat() mais j'ai qq prob, notamment pour me servir de S_ISREG et S_ISDIR. Je me positionne sur un fichier, je lui applique stat() avec en param d_name d'1 dirent et 1 stat. C'est là que je ne sais pas comment on se sert de S_ISREG par exemple.
Tu dois passer le champs st_mode de la structure stat en argument de la macro.Citation:
Envoyé par crischprolch
Exemple:
Code:
1
2
3
4
5 struct stat status; ... if (S_ISDIR (status.st_mode) ...
merci je v essayer
j'ai écrit :
et ça ne m'affiche rien...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 main(){ struct dirent *lecture; DIR *rep; rep = opendir(argv[1]); struct stat sb; lecture = readdir(rep); lecture = readdir(rep); while ((lecture = readdir(rep))) { char *s=lecture->d_name; printf("> %s\n", s); stat(lecture->d_name, &sb); if(S_ISDIR(sb.st_mode)) { printf("c un rep\n"); } if (S_ISREG(sb.st_mode)){ printf("c un fichier\n"); } } closedir(rep); }
enfin si, ça m'affiche les fichiers et dossiers contenus dans le repertoire passé en param mais je voulais aussi qu'il dise pour chaque si c un fichier ou un dossier...
Il faudrait que tu utilises correctement la balise CODE la prochaine fois ;)
Bon, voici ton code remanié (un peu):
Et la sortie qui va bien:Code:
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 #include <stdlib.h> #include <stdio.h> #include <dirent.h> #include <sys/stat.h> int main (int argc, char ** argv) { struct dirent * lecture = NULL; DIR *rep = NULL; struct stat sb; int ret = 0; if (argc > 1) { rep = opendir(argv[1]); if (rep != NULL) { while ((lecture = readdir(rep)) != NULL) { printf("> %s\n", lecture->d_name); ret = stat(lecture->d_name, &sb); if (ret == 0) { if(S_ISDIR(sb.st_mode)) { printf("c un rep\n"); } if (S_ISREG(sb.st_mode)){ printf("c un fichier\n"); } } } } } if (rep != NULL) { closedir(rep); } return EXIT_SUCCESS; }
C'est bien ce que tu attendais ?Citation:
franhec@franhec-ubuntu:~/Documents$ ./test /home/franhec/Documents/
> .
c un rep
> ..
c un rep
> Programmation
c un rep
> Mes Images
c un rep
> Téléchargements
c un rep
> CNAM
c un rep
> Test.class
c un fichier
> main.c
c un fichier
> test
c un fichier
> Test.java
c un fichier
Quelques remarques en passant:
Les prototypes pour le main sont:
ouCode:int main (void)
main retourne toujours un entier donc il faut mettre un return à la fin du main.Code:int main (int argc, char ** argv)
Ca:
c'est inutile, tu passe directement lecture->d_name en argument comme pour l'affichage du nom dans ton printf.Code:char *s=lecture->d_name;
Ca:
c'est inutile si tu le fait déjà dans la boucle.Code:
1
2 lecture = readdir(rep); lecture = readdir(rep);
Il ne faut jamais oublier de tester le retour des fonctions comme stat par exemple, ce que tu ne fait pas.
Voilà, c'est à peu près tout, du moins les principales choses ;)
EDIT J'ai mis le code à jour, j'avais oublié quelque chose :aie:
merci beaucoup
Au plaisir ! Si tu comprend pas un truc hésite pas.Citation:
Envoyé par crischprolch
Heureusement !Citation:
Envoyé par crischprolch
Merci de poster du code testableCitation:
Project : Forums
Compiler : GNU GCC Compiler (called directly)
Directory : C:\dev\forums2\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c:1: warning: return type defaults to `int'
main.c: In function `main':
main.c:3: error: `DIR' undeclared (first use in this function)
main.c:3: error: (Each undeclared identifier is reported only once
main.c:3: error: for each function it appears in.)
main.c:3: error: `rep' undeclared (first use in this function)
main.c:4: warning: implicit declaration of function `opendir'
main.c:4: error: `argv' undeclared (first use in this function)
main.c:5: error: storage size of 'sb' isn't known
main.c:7: warning: implicit declaration of function `readdir'
main.c:7: warning: assignment makes pointer from integer without a cast
main.c:8: warning: assignment makes pointer from integer without a cast
main.c:9: warning: assignment makes pointer from integer without a cast
main.c:11: error: dereferencing pointer to incomplete type
main.c:12: warning: implicit declaration of function `printf'
main.c:13: warning: implicit declaration of function `stat'
main.c:13: error: dereferencing pointer to incomplete type
main.c:14: warning: implicit declaration of function `S_ISDIR'
main.c:17: warning: implicit declaration of function `S_ISREG'
main.c:21: warning: implicit declaration of function `closedir'
main.c:5: warning: unused variable `sb'
main.c:22:2: warning: no newline at end of file
Process terminated with status 1 (0 minutes, 3 seconds)
8 errors, 13 warnings
:tagcode: