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

Résolu/Fermé
MounaRM Messages postés 19 Date d'inscription jeudi 10 juin 2010 Statut Membre Dernière intervention 27 avril 2011 - Modifié par MounaRM le 15/06/2010 à 13:55
MounaRM Messages postés 19 Date d'inscription jeudi 10 juin 2010 Statut Membre Dernière intervention 27 avril 2011 - 15 juin 2010 à 15:05
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 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
15 juin 2010 à 14:41
peut être un problème entre chemin relatif et absolu lors des récursions ?
0
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 jeudi 10 juin 2010 Statut Membre Dernière intervention 27 avril 2011
15 juin 2010 à 15:02
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 jeudi 10 juin 2010 Statut Membre Dernière intervention 27 avril 2011
Modifié par MounaRM le 15/06/2010 à 15:06
bon maintenant le code a marché
merci pour votre attention!
0