Comptage de fichiers + poids du dossier avec fonction FindFirst et Récursivité
Jaybiboo
Messages postés4Date d'inscriptionjeudi 23 novembre 2000StatutMembreDernière intervention10 mai 2009
-
10 mai 2009 à 15:08
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 2014
-
10 mai 2009 à 19:20
Bonjour à tous ceux qui prendront le temps de me lire !
Actuellement en fin de BTS Informatique et Réseau pour l'Industrie et les Services techniques, je dois bientôt rendre mon projet. Il comporte une partie de développement et je ne suis pas trop doué. Je dois faire un programme qui testera si un logiciel s'est bien installé. Pour ce, le programme doit compter le nombre de fichiers présents dans un répertoire, et rapporter son poids total.
La fonction findfirst m'a semblé bonne, c'est donc grâce à celle ci que j'ai pondu le code ci dessous.
Il faut cependant penser à la récursivité, c'est à dire que lorsque le programme voit un sous dossier dans le dossier spécifié, il doit le parcourir et incrémenter les compteurs de nombre de fichier et du poids total.
Ceci est également vrai pour des sous-sous-dossier, etc...
Je ne sais pas du tout si je m'y suis bien pris pour le code, comme dit plus haut, je ne suis pas très doué, et je m'excuse pour les éventuelles absurdités que vous pourrez lire...
Je vous remercie d'avance pour votre lecture et votre éventuelle aide.
void main (void)
{
int nf,td; //déclaration des variables NombreFichier nf et TailleDossier td
nf=0; //mise à 0 du nombre de fichiers
td=0; //mise à 0 de la taille du dossier
explorerDossier("C:\\*.*",nf,td); //appel de la fonction exploreDossier qui devra chercher dans le repertoire C:/
void explorerDossier(char nomDossier[],int *nf, int *td)
{
struct ffblk ffblk; //initialisation de la structure ffblk
cout << nomDossier; //affichage du nom du dossier de base
int done;
done = findfirst(nomDossier,&ffblk,FA_DIREC); // on définit la condition "done"
while (!done){ //tant qu'il reste des éléments
if (ffblk.ff_attrib!=FA_DIREC) { //si c'est un fichier
printf(" %s : %d", ffblk.ff_name,ffblk.ff_fsize); //alors on affiche le nom et la taille de ce fichier
(*nf)++; //et on incrémente de 1 le compteur du nombre de fichiers
*td=*td+ffblk.ff_fsize; //et on ajoute le poids de ce fichier au poids total du dossier *td
}
else{ //sinon
for (ffblk.ff_name!="." && ffblk.ff_name!=".." ){ // pour les dossiers n'étant pas "." ou ".."
explorerDossier(char nomDossier[],nf,td); //alors on rappelle la fonction elle meme
}
}
done = findnext(&ffblk); //tant qu'il reste des éléments
}
}
ps : je travaille en C avec Borland C++ Builder 5.02 mais si le travail se simplifie en utilisant du C++ avec C++ builder 6, je dispose de ce logiciel.
</stdlib.h></dos.h></conio.h></dir.h></stdio.h>
Jaybiboo
Messages postés4Date d'inscriptionjeudi 23 novembre 2000StatutMembreDernière intervention10 mai 2009 10 mai 2009 à 15:21
Bonjour à tous ceux qui prendront le temps de me lire !
Actuellement en fin de BTS Informatique et Réseau pour l'Industrie et les Services techniques, je dois bientôt rendre mon projet. Il comporte une partie de développement et je ne suis pas trop doué.
Je dois faire un programme qui testera si un logiciel s'est bien installé. Pour ce, le programme doit compter le nombre de fichiers présents dans un répertoire, et rapporter son poids total. La fonction findfirst m'a semblé bonne, c'est donc grâce à celle ci que j'ai pondu le code ci dessous.
Il faut cependant penser à la récursivité, c'est à dire que lorsque le programme voit un sous dossier dans le dossier spécifié, il doit le parcourir et incrémenter les compteurs de nombre de fichier et du poids total.
Ceci est également vrai pour des sous-sous-dossier, etc...
Je ne sais pas du tout si je m'y suis bien pris pour le code, comme dit plus haut, je ne suis pas très doué, et je m'excuse pour les éventuelles absurdités que vous pourrez lire...
Je vous remercie d'avance pour votre lecture et votre éventuelle aide.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 10 mai 2009 à 16:15
Bienvenue,
"Réponse acceptée", c'est pas pour dire que tu accèptes la réponse, mais que c'est la réponse que tu attendais. Qui corrige ton problème quoi. Je désaccepte.
Soit dit en passant, quel est ton problème ?
Je suis pas trop famillié avec ton code... Pour faire de la programmation windows, on inclus généralement surtout windows.h.
A vu de nez j'ai un gros doute sur tes égalités, ffblk.ff_name!="." et l'autre. Si c'est du char*, un strcmp est probablement plus adapté.
Pour la taille des fichiers tu as GetFileSize de windows.h. Mais tu as peut être une autre solution dans dir.h ou autre...
Jaybiboo
Messages postés4Date d'inscriptionjeudi 23 novembre 2000StatutMembreDernière intervention10 mai 2009 10 mai 2009 à 16:53
"Réponse acceptée", c'est pas pour dire que tu accèptes la réponse, mais que c'est la réponse que tu attendais. Qui corrige ton problème quoi. Je désaccepte.
D'accord, je le saurais pour la prochaine fois :)
Soit dit en passant, quel est ton problème ?
Heu.... Erreurs de compilation... Mais le truc c'est que je ne sais meme pas si ca tient la route la façon dont j'ai écris mon code, il y a peu être des abbérations à corriger en premier lieu, c'est ce que je cherche comme aide ici.
A vu de nez j'ai un gros doute sur tes égalités, ffblk.ff_name!="."
En fait c'est suite à un conseil de mon prof de dev, lorsque je parcoure les sous dossier d'un repertoire, il ne faut pas tenir compte des dossiers systeme présents dans chaque dossier c'est à dire le dossier "." et ".."
J'ai donc fait une boucle FOR avec comme condition que l'atribut NAME soit different de . et ..
Le symbole pour dire "different de..." est bien != non ?
Bienvenue,
"Réponse acceptée", c'est pas pour dire que tu accèptes la réponse, mais que c'est la réponse que tu attendais. Qui corrige ton problème quoi. Je désaccepte.
Soit dit en passant, quel est ton problème ?
Je suis pas trop famillié avec ton code... Pour faire de la programmation windows, on inclus généralement surtout windows.h.
A vu de nez j'ai un gros doute sur tes égalités, ffblk.ff_name!="." et l'autre. Si c'est du char*, un GetFileSize de windows.h. Mais tu as peut être une autre solution dans dir.h ou autre...
Merci du conseil, je vais regarder de ce coté là
Si d'autres idées vous viennent.... n'hésistez pas, je vous en serais très reconnaissant.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 10 mai 2009 à 19:20
Oui, != est bien pour dire "différent de".
Mais les chaînes de caractères en C ne se manipulent pas de la même manière qu'en VB ou qu'en PHP.
Tu compares probablement des char*. Un char*, c'est un pointeur sur un char. Donc là, tu regarde si l'adresse contenue dans ffblk.ff_name est ma même que l'adresse de la chaîne constante ".". Ce qui ne peut pas arriver.
Pour faire une comparaison de chaîne, il faut le faire explicitement, avec strcmp.
C'est assez logique en fait... En C, tout le jeu d'instruction, if et le reste, ça ne fait que des choses très basique (Comparaison d'entiers, calculs simples, déplacement d'un entier...) Une comparaison de chaîne, c'est pas anodin. Il faut une boucle. Donc ça, c'est une fonction, par exemple strcmp, qui va s'en charger. En C, on voit tout de suite ce qui va être lent à l'exécution ou pas.