递归搜索计算机中的文件

时间:2014-09-03 08:40:10

标签: c++ file winapi recursion

我正在尝试使用WinAPI以递归方式搜索计算机中的文件:FindFirstFileFindNextFile

我不明白为什么,但我的代码不起作用。 在第一次运行中,一切都很好 - 我可以看到C盘中的所有内容。 当我进入子文件夹,例如C:\Program Files (x86)时,我发现文件夹中的所有文件都只是.,而如果我使用该函数而没有递归搜索,那么给定C:\Program Files (x86)的路径,我会得到里面所有文件夹的列表。

这是我的代码:

#include <Windows.h>
#include <iostream>
#include <string>

void FindFile(std::string directory)
{
std::string tmp = directory + "\\*";
WIN32_FIND_DATA file;
HANDLE search_handle=FindFirstFile(tmp.c_str(), &file);
if (search_handle != INVALID_HANDLE_VALUE)
{
    do
    {
        std::wcout << file.cFileName << std::endl;
        directory += "\\" + std::string(file.cFileName);
        FindFile(directory);
    }while(FindNextFile(search_handle,&file));

    if (GetLastError() != 18) // Error code 18: No more files left
        CloseHandle(search_handle);
}
}

int main()
{
    FindFile("C:");
}

变量tmp用于存储wildchar *,而目录包含要搜索的下一个文件(在循环内)。

我的错误是什么?

谢谢!

2 个答案:

答案 0 :(得分:8)

每个目录(根目录除外)在开头都有两个条目(...),您需要跳过这些条目。

否则,您将获得无限递归:

  • C:\*
  • C:\Program Files (x86)\*
  • C:\Program Files (x86)\.\*
  • C:\Program Files (x86)\.\.\*
  • C:\Program Files (x86)\.\.\.\*

等等。

(您还需要检查每个条目是一个文件还是一个目录,只是递归到目录中。)

例如:

#include <Windows.h>
#include <iostream>
#include <string>
#include <vector>    

void FindFile(const std::wstring &directory)
{
    std::wstring tmp = directory + L"\\*";
    WIN32_FIND_DATAW file;
    HANDLE search_handle = FindFirstFileW(tmp.c_str(), &file);
    if (search_handle != INVALID_HANDLE_VALUE)
    {
        std::vector<std::wstring> directories;

        do
        {
            if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                if ((!lstrcmpW(file.cFileName, L".")) || (!lstrcmpW(file.cFileName, L"..")))
                    continue;
            }

            tmp = directory + L"\\" + std::wstring(file.cFileName);
            std::wcout << tmp << std::endl;

            if (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                directories.push_back(tmp);
        }
        while (FindNextFileW(search_handle, &file));

        FindClose(search_handle);

        for(std::vector<std::wstring>::iterator iter = directories.begin(), end = directories.end(); iter != end; ++iter)
            FindFile(*iter);
    }
}

int main()
{
    FindFile(L"C:");
    return 0;
}

答案 1 :(得分:2)

你必须明确排除''。'和搜索结果中的“..”以便不对它们进行递归。