fonction parcourir des dossiers - C - Programmation
Marsh Posté le 12-03-2013 à 15:40:12
"char* daussier"
ça m'a tué ^^
Met nous un peu mieux en forme ton code, parce que là il y a des trucs bizarres:
Code :
|
Je te conseille de tester la valeur de retour de opendir() pour déterminer si l'entité est ou non un dossier
ex:
Code :
|
Marsh Posté le 13-03-2013 à 08:46:56
Je suis content que mon code t'ai amusé
Blague a part , J'ai éssayé de modifier mon code mais je n'y arrive toujours pas
Citation : |
Voila merci pour ton aide (précédante et future)
Marsh Posté le 13-03-2013 à 09:15:17
Pas de soucis, je suis pas pressé ^^
Je dirais plutôt :
Code :
|
Note : je n'ai pas compilé le code
Marsh Posté le 13-03-2013 à 10:44:45
Normalement, on utilise de la récursivité pour ce type de fonction.
Il faut juste faire un cas spécial de . et .. retournés par readdir pour ne pas boucler à l'infini
D'autre part, on teste habituellement si on a un fichier ou un répertoire avec fstat/fstat64
Et le
#ifndef WIN32
#include <sys/types.h>
#endif
est insuffisant, il faudra tout réécrire pour windows, qui n'a pas de opendir/readdir... mais utilise FindFirstFile/FindFirstNext...
A+,
Marsh Posté le 14-03-2013 à 09:07:46
Je bloque encore : pour l'instant ma fonction affiche les fichier avec l'option dossier elle ne prend pas en compte le parametre fichier
Citation : void ParcourirFichiers(char *dossier) |
Je vais essayer de faire ce que gilou m'a dit avec fstat ... en espérant que cela reglera mes problèmes..
Marsh Posté le 14-03-2013 à 09:20:57
Gilou est plus expérimenté que moi, il tiens certainement la clé ^^
Je te conseille de regarder un peu la récursivité, parce qu'il y a une belle erreur dans ton code:
http://franckh.developpez.com/tuto [...] cursivite/
Marsh Posté le 14-03-2013 à 11:11:13
L'algo récursif de base pour faire ce qu'il veut est très simple:
TraiteEntréeDossier(EntréeDossier entrée, Booléen toplevel)
Si Fichier(entrée) alors Imprimer(Nom(entrée)) puis sortir. (FinSi)
Si Dossier(entrée) alors
Si Nom(entrée) est '.' ou '..' et toplevel est faux alors sortir (FinSi)
Imprimer(Nom(entrée))
ListeEntréesDossier listeentrées <- ListerEntréesDossier(entrée)
Boucler sur élémentliste dans listeentrées
TraiteEntréeDossier(élémentliste, Faux)
FinBoucler
FinSi
sortir
A+,
Marsh Posté le 14-03-2013 à 11:31:10
J'ai tapé fstat, mais c'est stat que je voulais mentionner
Voici un exemple d'utilisation pour vérifier qu'un nom (complet ou local, selon le current working directory) est bien celui d'un dossier
Code :
|
La solution que tu as envisagée, appeler opendir(dossier) et vérifier que l'on a une erreur de type ENOTDIR ou pas n'est pas mauvaise à la base, mais je ne sais pas dans quelle mesure elle est efficace
A+,
Marsh Posté le 14-03-2013 à 11:46:02
merci pour les informations mais j'ai encore une question quelles librairies (je ne sait pas si c'est comme ca que je dois l'appeler) doit-je inclure pour stat ?
Marsh Posté le 14-03-2013 à 11:48:46
#include <sys/stat.h>
Cela fait des appels système Unix, donc a priori, pas besoin de linker avec une librairie spéciale il me semble.
A+,
Marsh Posté le 16-03-2013 à 18:08:30
Voila pour l'instant je tourne en rond
j'ai essayé de refaire mon code et pour l'instant il y a toujours des erreurs
Citation : #include <stdlib.h> |
Et je ne sait pas comment faire pour que la fonction isdir ouvre ce dossier ainsi que ce que je dois vraiment changer dans cette fonction...
merci d'avance pour l'aide future...
Marsh Posté le 16-03-2013 à 19:31:55
Citation : // j'ai une erreur a ce niveau : la taille de stbuf est inconnue |
Et mon post précédent, il sert à quoi?
Citation : bool isDir(dossier); |
ça, à cet endroit la, ça veut rien dire du tout, faut peut être réfléchir un minimum.
A+,
Marsh Posté le 18-03-2013 à 14:07:03
Bon j'ai enfin réussi a finir mon programme
Et merci gilou et crom29 de m'avoir aidé
Voila le code pour les prochains qui voudront faire pareil :
Citation : |
Marsh Posté le 18-03-2013 à 16:45:13
Bonjour,
Juste pour dire que sous windows un chemin peut faire jusqu'à MAX_PATH caractères de long et il me semble que cette valeur vaut dans les 260. ( http://msdn.microsoft.com/en-us/li [...] 85%29.aspx section "Maximum Path Length Limitation" )
Si tu explores les sous-dossiers et que l'arborescence est profonde, tu risques de planter ton programme avec strcat qui risque de concaténer un chemin beaucoup plus grand que tes 100 caractères de char chaine_chemin[100] .
J'imagine que c'est valable aussi sous linux... (edit: c'est encore pire: http://fixunix.com/questions/14623 [...] linux.html )
Marsh Posté le 18-03-2013 à 17:21:37
En plus, les systèmes anciens étaient parfois buggés.
Sur un unix je pouvais créér des répertoires récursivement et dépasser la taille autorisée à une époque (30 ans).
A+,
Marsh Posté le 18-03-2013 à 20:08:51
Il semblerait que ce soit compliqué en effet: http://insanecoding.blogspot.fr/20 [...] -isnt.html
Sinon pour windows si le MAX_PATH est de 260 caractères, certaines fonctions unicode (d'après la doc msdn de mon précédent message) permettent des chemins de ~32767 caractères....
Marsh Posté le 12-03-2013 à 14:44:44
Bonjour, je suis en train de m'entrainer sur le c et j'ai un petit souci
je cherche a faire un programme qui liste les fichiers dans un dossier et qui les affiche a l'écran jusque la ca marche
mais maintenant il faut qu'il détecte si il y a un dossier et qu'il rentre dedans et affiche les nouveaux fichiers
Merci d'avance pour vos réponses
Voici le code :
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <dirent.h>
/* Pour l'utilisation des dossiers */
#ifndef WIN32
#include <sys/types.h>
#endif
void ParcourirFichiers(char *daussier);
char *daussier;
ParcourirDossier(char *dossier)
{
if ((strchr(dossier, '.')) == NULL) // Si le nom du fichier n'a pas de point (une extension).
{
dossier=daussier;
}
void ParcourirFichiers(char *dossier);
}
ParcourirFichiers(char *dossier)
{
struct dirent *lecture;
DIR *rep;
rep = opendir(dossier);
lecture=readdir(rep);
while ((lecture=readdir(rep)) !=NULL)
{
printf("%s\n" , lecture->d_name);
}
}
main()
{
ParcourirFichiers("C:\\TeSt" );
ParcourirDossier("C:\\TeSt" );
return 300;
}