如何在Windows上以递归方式遍历C中的目录

时间:2010-01-10 22:30:17

标签: c windows winapi filesystems

最终,我想浏览一个文件夹的文件和子目录,并将一些内容写入我发现具有特定扩展名的所有文件(在我的情况下为.wav)。在循环时如何判断我所在的项目是否是目录?

5 个答案:

答案 0 :(得分:7)

这是你如何做到的(这完全来自内存所以可能有错误):

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()调用,但我发现Microsoft提供的模式匹配函数(即PathMatchFileSpec或其他)不如FindFirstFile()。虽然对于“* .wav”来说可能没问题。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

添加此解决了它:

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

答案 3 :(得分:0)

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)

答案 4 :(得分:0)