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 -
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!!
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:
- C++Parcours tous les fichiers d'un répertoire
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment ouvrir un fichier bin ? - Guide
- Renommer tous les fichiers d'un dossier - Guide
- Répertoire téléphonique gratuit - Télécharger - Bureautique
4 réponses
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.
++
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.
++
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);
}
}
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);
}
}