Comment parcourir récursivement les répertoires en C sous Windows

En fin de compte, je veux parcourir les fichiers et les sous-répertoires d’un dossier et écrire quelque chose dans tous les fichiers que je trouve ayant une certaine extension (.wav dans mon cas). en boucle Comment savoir si l’élément auquel je participe est un répertoire?

Voici comment vous le faites (tout est de la mémoire, il peut donc y avoir des erreurs):

void FindFilesRecursively(LPCTSTR lpFolder, LPCTSTR lpFilePattern) { TCHAR szFullPattern[MAX_PATH]; WIN32_FIND_DATA FindFileData; HANDLE hFindFile; // first we are going to process any subdirectories PathCombine(szFullPattern, lpFolder, _T("*")); hFindFile = FindFirstFile(szFullPattern, &FindFileData); if(hFindFile != INVALID_HANDLE_VALUE) { do { if(FindFileData.dwFileAtsortingbutes & FILE_ATTRIBUTE_DIRECTORY) { // found a subdirectory; recurse into it PathCombine(szFullPattern, lpFolder, FindFileData.cFileName); FindFilesRecursively(szFullPattern, lpFilePattern); } } while(FindNextFile(hFindFile, &FindFileData)); FindClose(hFindFile); } // Now we are going to look for the matching files PathCombine(szFullPattern, lpFolder, lpFilePattern); hFindFile = FindFirstFile(szFullPattern, &FindFileData); if(hFindFile != INVALID_HANDLE_VALUE) { do { if(!(FindFileData.dwFileAtsortingbutes & FILE_ATTRIBUTE_DIRECTORY)) { // found a file; do something with it PathCombine(szFullPattern, lpFolder, FindFileData.cFileName); _tprintf_s(_T("%s\n"), szFullPattern); } } while(FindNextFile(hFindFile, &FindFileData)); FindClose(hFindFile); } } 

Donc, vous pourriez appeler cela comme

 FindFilesRecursively(_T("C:\\WINDOWS"), _T("*.wav")); 

pour trouver tous les fichiers * .wav dans C: \ WINDOWS et ses sous-répertoires.

Techniquement, vous ne devez pas faire deux appels FindFirstFile (), mais je trouve que les fonctions de correspondance de modèle fournies par Microsoft (c.-à-d. PathMatchFileSpec ou autre) ne sont pas aussi efficaces que FindFirstFile (). Bien que pour “* .wav”, ce serait probablement bien.

Sur la base de votre mention de .wav , je vais deviner que vous écrivez du code pour Windows (qui semble être le plus souvent utilisé pour les fichiers *.wav ). Dans ce cas, vous utilisez FindFirstFile et FindNextFile pour parcourir les répertoires. Ceux-ci utilisent une structure WIN32_FIND_DATA , qui a un membre dwFileAtsortingbutes qui contient des indicateurs indiquant les atsortingbuts du fichier. Si dwAtsortingbutes & FILE_ATTRIBUTE_DIRECTORY est différent de zéro, vous avez le nom d’un répertoire.

Très utile. J’ai quand même eu un débordement de stack car il ajoutait toujours “.” au chemin et revenir au même chemin = boucle sans fin.

En ajoutant cela résolu:

// found a subdirectory; recurse into it PathCombine(szFullPattern, lpFolder, FindFileData.cFileName); FindFilesRecursively(szFullPattern, lpPattern); if (FindFileData.cFileName[0] == '.') continue;

opendir et readdir (sur unix), voici un exemple:

http://opengroup.org/onlinepubs/007908775/xsh/readdir.html

ou FindFirstFile sur windows

vous pouvez également utiliser le shell assez facilement:

 find . -name "*.wav" or ls **/*.wav (in zsh and newer bashes)