Citation:
NAME OR <ENTER> FOR EXIT) : c:\\dev-cpp
FOLDER c:\\dev-cpp:
NAME OR <ENTER> FOR EXIT) :
Citation:
NAME OR <ENTER> FOR EXIT) : c:\dev-cpp
FOLDER c:\dev-cpp:
NAME OR <ENTER> FOR EXIT) :
Version imprimable
Citation:
NAME OR <ENTER> FOR EXIT) : c:\\dev-cpp
FOLDER c:\\dev-cpp:
NAME OR <ENTER> FOR EXIT) :
Citation:
NAME OR <ENTER> FOR EXIT) : c:\dev-cpp
FOLDER c:\dev-cpp:
NAME OR <ENTER> FOR EXIT) :
Votre méthode ne fonction peut être que sous Linux ?
Quelle est la valeur retournée par la fonction test() ci-dessous???
ThierryCode:
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 int list(char *directory, size_t sizeDir) { DIR *dir = NULL; int err; struct dirent *file = NULL; struct stat infos; char cwd[32] = ""; if ((dir = opendir(directory)) == NULL) { return 4; } printf("FOLDER %s:\n", directory); /* -tc- on memorise le repertoire courant de travail */ if (getcwd(cwd, sizeof cwd) == NULL) { /* -tc- gestion des erreurs a ameliorer */ return 3; } /* -tc- on change le repertoire de travail courant qui devient directory */ if (chdir(directory) != 0) { /* -tc- idem: a ameliorer */ return 2; } while ((file = readdir(dir)) != NULL) { /* -tc- ici, tu appelais deux fois stat() */ err = stat(file->d_name, &infos); if (strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) { if (err == 0) { if (S_ISDIR (infos.st_mode)) { printf("\n[FOLDER]\t%s\n", file->d_name); } else { printf("\n[FILE]\t%s\n", file->d_name); } } else { printf ("'%s' IS UNKNOW\n", directory); chdir(cwd); return 1; } } } /* -tc- on retourne dans le repertoire de travail initial */ chdir(cwd); printf("\nEND OF THE FOLDER: %s\n", directory); closedir(dir); (void) sizeDir; return 0; }
Thierry : Aucune fonction test
Emmanuel : Je l'ai dis 2 fois :D
Excuse-moi, la fonction list() que j'ai posté ici. A part ça, toutes les fonctions utilisées sont POSIX.1 et sont toutes implantées par MinGW. Il n'y a aucune supposition Linux-spécifique au sein de la fonction list().
Thierry
Tout dépend de s'il y a des erreurs où pas, si tout ce passe bien :
return 0;
C'est ce que retourne la fonction list() ou c'est ce que tu penses? L'intérêt de la manipulation est d'identifier où se produit l'erreur. As-tu essayé avec la fonction que j'ai posté ici?
Thierry
Retour : 3
Je ne comprend pas à quoi sert :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
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 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <dirent.h> #include <errno.h> #include <sys/stat.h> #include <unistd.h> #include "myHeader.h" int list(char *directory, size_t sizeDir); int main(void) { int end, rslt=0; size_t sizeDir; char directory[256]; sizeDir = sizeof directory; do { printf ("NAME OR <ENTER> FOR EXIT) : "); fgets (directory, sizeof directory, stdin); /* we take the path */ fclean (directory, stdin); end = (directory[0] == '\0'); if (!end) { rslt = list(directory, sizeDir); fprintf(stdout, "%i", rslt); } } while (!end); //while end[0] != '\0' return 0; } int list(char *directory, size_t sizeDir) { DIR *dir = NULL; int err; struct dirent *file = NULL; struct stat infos; char cwd[32] = ""; if ((dir = opendir(directory)) == NULL) { return 4; } printf("FOLDER %s:\n", directory); /* -tc- on memorise le repertoire courant de travail */ if (getcwd(cwd, sizeof cwd) == NULL) { /* -tc- gestion des erreurs a ameliorer */ return 3; } /* -tc- on change le repertoire de travail courant qui devient directory */ if (chdir(directory) != 0) { /* -tc- idem: a ameliorer */ return 2; } while ((file = readdir(dir)) != NULL) { /* -tc- ici, tu appelais deux fois stat() */ err = stat(file->d_name, &infos); if (strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) { if (err == 0) { if (S_ISDIR (infos.st_mode)) { printf("\n[FOLDER]\t%s\n", file->d_name); } else { printf("\n[FILE]\t%s\n", file->d_name); } } else { printf ("'%s' IS UNKNOW\n", directory); chdir(cwd); return 1; } } } /* -tc- on retourne dans le repertoire de travail initial */ chdir(cwd); printf("\nEND OF THE FOLDER: %s\n", directory); closedir(dir); (void) sizeDir; return 0; }
Vu que l'on ne travail que dans directory ?!Code:
1
2
3
4
5
6
7 /* -tc- on memorise le repertoire courant de travail */ if (getcwd(cwd, sizeof cwd) == NULL) { /* -tc- gestion des erreurs a ameliorer */ return 3; }
Lorsque tu passes file->d_name à la fonction stat(), elle regarde dans le 'current working directory', et non dans directory...
Thierry
Ah ok :) Mais vous dîtes que chez vous ca marche alors pourquoi ca ne marche pas chez moi (sachant que ca compile et que le path est bon -_- )
Le code suivant fonctionne. C'était le tampon cwd qui n'était pas assez grand. En effet, les chemins sous Windows sont souvent plus long que sous Linux. En passant de char cwd[32]; à char cwd[100];, c'est en ordre! (testé sous WinXP)
ThierryCode:
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 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <dirent.h> #include <errno.h> #include <sys/stat.h> #include <unistd.h> #include "myHeader.h" int list(char *directory, size_t sizeDir); int main(void) { int end, rslt=0; size_t sizeDir; char directory[256]; sizeDir = sizeof directory; do { printf ("NAME OR <ENTER> FOR EXIT) : "); fgets (directory, sizeof directory, stdin); /* we take the path */ fclean (directory, stdin); end = (directory[0] == '\0'); if (!end) { rslt = list(directory, sizeDir); fprintf(stdout, "rslt = %i", rslt); } } while (!end); //while end[0] != '\0' return 0; } int list(char *directory, size_t sizeDir) { DIR *dir = NULL; int err; struct dirent *file = NULL; struct stat infos; char cwd[100] = ""; if ((dir = opendir(directory)) == NULL) { return EXIT_FAILURE; } printf("FOLDER %s:\n", directory); /* -tc- on memorise le repertoire courant de travail */ if (getcwd(cwd, sizeof cwd) == NULL) { /* -tc- gestion des erreurs a ameliorer */ return EXIT_FAILURE; } /* -tc- on change le repertoire de travail courant qui devient directory */ if (chdir(directory) != 0) { /* -tc- idem: a ameliorer */ return EXIT_FAILURE; } while ((file = readdir(dir)) != NULL) { /* -tc- ici, tu appelais deux fois stat() */ err = stat(file->d_name, &infos); if (strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) { if (err == 0) { if (S_ISDIR (infos.st_mode)) { printf("\n[FOLDER]\t%s\n", file->d_name); } else { printf("\n[FILE]\t%s\n", file->d_name); } } else { printf ("'%s' IS UNKNOW\n", directory); chdir(cwd); return EXIT_FAILURE; } } } /* -tc- on retourne dans le repertoire de travail initial */ chdir(cwd); printf("\nEND OF THE FOLDER: %s\n", directory); closedir(dir); (void) sizeDir; return EXIT_SUCCESS; }
Ca fonction à merveille (merci). Je vais étudier tout cela en détails demain :)
Désolé pour tout ce temps (j'avais une tonne de devoirs -_- ):
J'ai rajouter des trucs sympas (utiles pour l'utilisateur)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
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 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <dirent.h> #include <errno.h> #include <sys/stat.h> #include <unistd.h> #include "myHeader.h" int list(char *directory, size_t sizeDir); int main(void) { int end, error=0; size_t sizeDir; char directory[256]; sizeDir = sizeof directory; do { printf ("Path or <enter> for exit: "); fgets (directory, sizeof directory, stdin); /* -sh- we take the path */ fclean (directory, stdin); end = (directory[0] == '\0'); if (!end) { error = list(directory, sizeDir); switch(error) { case 0: fprintf(stdout, "\nNo Error\n\n"); break; case 1: fprintf(stdout, "\n%s is unknown\n\n", directory); break; case 2: fprintf(stdout, "\nInternal error\n\n"); break; case 3: fprintf(stdout, "\nInternal error\n\n"); break; case 4: fprintf(stdout, "\nError when reading %s\n\n", directory); break; } } } while (!end); /* while end[0] != '\0' */ return 0; } int list(char *directory, size_t sizeDir) { char cwd[256] = ""; DIR *dir = NULL; int err; struct dirent *file = NULL; struct stat infos; if ((dir = opendir(directory)) == NULL) { return 4; } printf("FOLDER %s:\n", directory); /* -tc- we memorise the current working directory */ if (getcwd(cwd, sizeof cwd) == NULL) return 3; if (chdir(directory) != 0) return 2; while ((file = readdir(dir)) != NULL) { err = stat(file->d_name, &infos); if (strcmp(file->d_name, ".") && strcmp(file->d_name, "..")) { if (err == 0) { if (S_ISDIR (infos.st_mode)) { printf("\n[Folder]\t%s\n", file->d_name); } else { printf("\n[File]\t%s\n", file->d_name); } } else { chdir(cwd); return 1; } } } /* -tc- we return the initial repertory */ chdir(cwd); printf("\nEND OF THE FOLDER: %s\n", directory); closedir(dir); (void) sizeDir; return 0; }
J'ai compris : (dîtes moi si c'est pas ca)
-chdir permet de remplacer current doc par le path fournit en paramètre
Pas compris :
-(Ca veut dire quoi en gros ?)Code:La fonction getcwd() copie le chemin d'accès absolu du répertoire de travail courant dans la chaîne pointée par buf, qui est de longueur size.
--Code:if (strcmp(file->d_name, ".") && strcmp(file->d_name, ".."))
Où puis-je trouver ce que contient dirent (je sais déjà ce que contient stat) ?Code:struct dirent *file = NULL;
Merci d'avance :)
stat est public (le but est d'avoir des infos). dirent est opaque (sauf d_name). Tu n'auras pas d'infos supplémentaires.
http://www.opengroup.org/onlinepubs/.../dirent.h.html
Entendu mais je cherche quels champs contient dirent
Et pour l'autre question ?
getcwd() fait l'inverse de chdir() : chdir() permet de forcer le répertoire courant, getcwd() permet de le consulter.
J'avais cru ("Ne crois pas, instruis toi", je sais -_- ) que vous parliez d'autre chose. Merci Emmanuel et Medinoc.
Sinon pour ceci ? :
Code:if (strcmp(file->d_name, ".") && strcmp(file->d_name, ".."))
Ca n'a pas de sens ?!Citation:
En français : si(nom fichier = ".") et (nom fichier = "..")) alors
La premiere chose a apprendre, c'est a lire les docs. Et la deuxieme a les trouver soi-meme. Poser des questions, c'est bien si on a d'abord essaye de se debrouiller tout seul.
Comme tu n'es pas encore a la deuxieme etape et que tu t'interesses a POSIX: http://www.unix.org/version3. Regarde en particulier "Interface Tables" et "Read the online Single UNIX specification Version 3".