Explorer un repertoire [C/C++] - C++ - Programmation
Marsh Posté le 09-07-2002 à 22:22:57
Va faire un tour du côté de findfirst & findnext, un ch'ti coup de récursion et l'tour est joué
Marsh Posté le 09-07-2002 à 22:45:06
Wow, incroayble la rapidite de la reponse !!!
Bon, je file voir ceci
merci bcp, je sens que je vais dormir + que 3 heures cette nuit c'est chouette !!!
Marsh Posté le 10-07-2002 à 00:40:16
Bon, voila c'est 1h00 ca marche toujours pas, j'en suis a mon 3eme café, je sais toujours pas pourquoi ca marche pas....
#include <iostream.h>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void lister(LPCTSTR file);
void main()
{
lister("*.*" );
}
void lister(LPCTSTR fichier)
{
char *new_path="";
WIN32_FIND_DATA wData;
char nom[MAX_PATH];
HANDLE listing;
listing = FindFirstFile(fichier, &wData);
while((FindNextFile(listing, &wData)))
{
if(wData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY ){
cout << "DIRECTORY : " << wData.cFileName<< "\n";
new_path=wData.cFileName;
strcat(new_path,"\\*" );
lister(new_path);
}
else
cout << "FILE : " << wData.cFileName<< "\n";
}
}
Si je le lance des la racine, il boucle sans fin ( il alterne entre la 1er directory et ".." j'ai beau tester avant de lancer ma recursivité si je la lance sur ".." il n'y a rien a faire....
Doit y avoir un truc qui m'echappe la......tiens c'est quoi ce petit mec tout vert qui sort d'une soucoupe ?!
Marsh Posté le 10-07-2002 à 03:20:22
ben heuh, ca me semble normale, vu que dans un rep il y a tjs les rep "." et ".."
donc quand tu fais ta recursion fait gaffe a pas visiter ces reps
Ensuite, deux trucs:
1) pourquoi tu regarde pas le fichier retourné par findFirstFile ? tu attaque directmeent avec celui donné par findNextFile
2) perso je remplacerais
if(wData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )
par
if( (wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )!=0)
ca peut t'eviter des blagues si ton rep a des attributs (genre archive)
Marsh Posté le 10-07-2002 à 09:27:06
Tous d'abord, merci a tous ceux qui ont repondu.
Pour mon probleme de la recursivite, j'ai bien essaye de mettre
if( new_patch != "..\*.*" )
lister(new_path);
Pour eviter de "remonter" mon arborescence, le probleme c'est que ce test est toujours vrai.....meme en utilisant strcmp !
Marsh Posté le 10-07-2002 à 09:29:06
if(wData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )
if( (wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )!=0)
?! A, la je comprends pas la notation, le "&" c'est pas un "et" logique "&&" ?!
Marsh Posté le 10-07-2002 à 13:46:53
bartleby a écrit a écrit : Tous d'abord, merci a tous ceux qui ont repondu. Pour mon probleme de la recursivite, j'ai bien essaye de mettre if( new_patch != "..\*.*" ) lister(new_path); Pour eviter de "remonter" mon arborescence, le probleme c'est que ce test est toujours vrai.....meme en utilisant strcmp ! |
heuh attention !
deja il FAUT utiliser strcmp pour comparer des chaines de caracteres
Ensuite strcmp te renvoie 0 si ls chaines sont identiques
Marsh Posté le 10-07-2002 à 23:43:12
bartleby a écrit a écrit : if(wData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY ) if( (wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )!=0) ?! A, la je comprends pas la notation, le "&" c'est pas un "et" logique "&&" ?! |
J'imagine que "wData.dwFileAttributes" est une variable plein de flags. Du style:
00001010
si le 5ieme bit est l'attribut "directory", alors tu testes avec un "&":
00001010 <- dwFileAttributes
& 00001000 <- FILE_ATTRIBUTE_DIRECTORY
-----------
00001000
resultat: non nul, donc directory
Marsh Posté le 09-07-2002 à 22:18:28
Bonjour a tous,
Je cherche a faire une operation sur tout les fichiers d'un certain type ( vxml) dans tout les fichiers present dans la sous arborescence d'un repertoire.
Bon, en gros mon seul probleme c'est d'arriver a parcourir les repertoires.
J'ai bien pensé a lancer mon programme avec l'argument '*', mais la liste que j'obtiens ne fais pas la difference entre les repertoires et les fichiers !!! Y a-t-il une solution pour avoir les fichiers dans un tableau et les repertoires dans un autre ?!
Merci d'avance