C++Parcours tous les fichiers d'un répertoire

Résolu
MounaRM Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -  
MounaRM Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
j'essaye de développé un code qui permet de parcourir tous les fichiers d'un repertoire (en tenant compte de tous les fichiers contenus dans tous les sous repertoires de ce repertoire)

voici le code:


int AfficherListeFichiers ( string str )
//int AfficherListeFichiers (string Dossier )
{
WIN32_FIND_DATA ffd;
LARGE_INTEGER filesize;
TCHAR szDir[MAX_PATH];
size_t length_of_arg;
HANDLE hFind = INVALID_HANDLE_VALUE;
DWORD dwError=0;



TCHAR *Dossier=new TCHAR[str.size()+1];
Dossier[str.size()]=0;

std::copy(str.begin(),str.end(),Dossier);


StringCchLength(Dossier, MAX_PATH, &length_of_arg);

if (length_of_arg > (MAX_PATH - 3))
{
_tprintf(TEXT("\nDirectory path is too long.\n"));
return (-1);
}

_tprintf(TEXT("\nTarget directory is %s\n\n"), Dossier);

// Prepare string for use with FindFile functions. First, copy the
// string to a buffer, then append '\*' to the directory name.

StringCchCopy(szDir, MAX_PATH, Dossier);
StringCchCat(szDir, MAX_PATH, TEXT("\\*.* "));


// Find the first file in the directory.

hFind = FindFirstFile(szDir, &ffd);

if (INVALID_HANDLE_VALUE == hFind)
{
DisplayErrorBox(TEXT("FindFirstFile"));
return dwError;
}

// List all the files in the directory with some info about them.


std::string SousRep ;
std::string CheminSousRep ;
while (FindNextFile(hFind, &ffd) != 0)
{



if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
_tprintf(TEXT(" Nom Repertoire : %s <DIR>\n"), ffd.cFileName );


SousRep=ws2s(ffd.cFileName);

CheminSousRep =str + "\\"+ SousRep;
if ((SousRep != ".") && (SousRep != ".."))
{ // std::string CheminSousRep ;
// SousRep=ffd.cFileName
CheminSousRep =str + "\\"+ SousRep;
// cout << SousRep << '\n';
//cout << CheminSousRep << '\n';
// return ParcourirFichiers ( CheminSousRep );
}

}
else
{

// c'est un fichier
// appel fonction de recherche // liste des paramètre
filesize.LowPart = ffd.nFileSizeLow;
filesize.HighPart = ffd.nFileSizeHigh;
_tprintf(TEXT(" %s %ld bytes\n"), ffd.cFileName, filesize.QuadPart);
std::string FileName ;
FileName=ws2s(ffd.cFileName);
CheminSousRep =str + "\\"+ FileName;
i=lireXMPData(CheminSousRep,Titre);
}

}


dwError = GetLastError();
if (dwError != ERROR_NO_MORE_FILES)
{
DisplayErrorBox(TEXT("FindFirstFile"));
}

FindClose(hFind);
return dwError;
}

le problème c'est que ce code affiche les fichiers et les noms des sous repertoires seulement(et non pas les fichiers contenant dans les sous repertoires)
si je fais appel résursif de "AfficherListeFichiers ", ceci permet de parcourir les fichiers du repertoire et les fichiers du 1ier sous repertoire seulement!!!
aidez moi svp , c'est urgent!!


A voir également:

4 réponses

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
peut être un problème entre chemin relatif et absolu lors des récursions ?
0
Ametisse
 
Salut,

Je ne vois pas l'appel récursif ? Peux tu nous montrer comment tu fais car je pense que le pb vient de là. La récursivité est bien la solution à ton problème.

++
0
MounaRM Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
l appel récursif se fait comme suit :


while (FindNextFile(hFind, &ffd) != 0)
{



if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
_tprintf(TEXT(" Nom Repertoire : %s <DIR>\n"), ffd.cFileName );


SousRep=ws2s(ffd.cFileName);

CheminSousRep =str + "\\"+ SousRep;
if ((SousRep != ".") && (SousRep != ".."))
{ // std::string CheminSousRep ;
// SousRep=ffd.cFileName
CheminSousRep =str + "\\"+ SousRep;
// cout << SousRep << '\n';
//cout << CheminSousRep << '\n';
int j;
j= AfficherListeFichiers( CheminSousRep );
}

}
else
{

// c'est un fichier
// appel fonction de recherche // liste des paramètre
filesize.LowPart = ffd.nFileSizeLow;
filesize.HighPart = ffd.nFileSizeHigh;
_tprintf(TEXT(" %s %ld bytes\n"), ffd.cFileName, filesize.QuadPart);
std::string FileName ;
FileName=ws2s(ffd.cFileName);
CheminSousRep =str + "\\"+ FileName;
i=lireXMPData(CheminSousRep,Titre);
}

}
0
MounaRM Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
bon maintenant le code a marché
merci pour votre attention!
0