[C/C++] Explorer un repertoire

Explorer un repertoire [C/C++] - C++ - Programmation

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 :)

Reply

Marsh Posté le 09-07-2002 à 22:18:28   

Reply

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é ;)

Reply

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 :D !!!

Reply

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 ?!

Reply

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)
 
 
 
 
 

Reply

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 !
 
 
 
 
     

Reply

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 "&&" ?!

Reply

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
 
 

Reply

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed