如何在Windows上recursion遍历C中的目录

最终,我想通过一个文件夹的文件和子目录,并写入所有文件,我发现有一定的扩展名(.WAV在我的情况)。 什么时候循环如何知道我所在的项目是一个目录?

Solutions Collecting From Web of "如何在Windows上recursion遍历C中的目录"

下面是你如何做的(这是从内存中的所有可能会有错误):

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.dwFileAttributes & 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.dwFileAttributes & 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); } } 

所以你可以这样称呼

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

在C:\ WINDOWS及其子目录中查找所有* .wav文件。

从技术上讲,你不必做两次FindFirstFile()调用,但我发现微软提供的模式匹配函数(即PathMatchFileSpec或其他)不如FindFirstFile()。 虽然“* .wav”可能会很好。

根据你提到的.wav ,我会猜测你正在编写Windows代码(这似乎是*.wav文件最常见的地方)。 在这种情况下,您使用FindFirstFileFindNextFile来遍历目录。 这些使用WIN32_FIND_DATA结构,它有一个成员dwFileAttributes ,其中包含指示文件属性的标志。 如果dwAttributes & FILE_ATTRIBUTE_DIRECTORY不为零,则您有一个目录的名称。

很有帮助。 无论如何,我一直在堆栈溢出,因为它总是添加“。” 到路径并返回到相同的路径=无限循环。

添加这个解决了它:

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

opendir和readdir(在unix上),这里是一个例子:

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

或者在Windows上的FindFirstFile

你也可以很容易地使用shell:

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