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 ?
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
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
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.`d_reclen' member that gives the size of the entire directory entry.
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
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.Envoyé par crischprolch
Exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 struct stat status; ... if (S_ISDIR (status.st_mode) ...
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
j'ai écrit :
et ça ne m'affiche rien...
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 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 : 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 #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 ?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:
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part int main (void)
main retourne toujours un entier donc il faut mettre un return à la fin du main.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part char *s=lecture->d_name;
Ca:
c'est inutile si tu le fait déjà dans la boucle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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![]()
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Au plaisir ! Si tu comprend pas un truc hésite pas.Envoyé par crischprolch
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Heureusement !Envoyé par crischprolch
Merci de poster du code testableProject : 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
![]()
Partager