通过搜索硬盘查找文件目录

时间:2019-12-05 05:01:09

标签: c++ file search directory find

因此,我尝试搜索特定的硬盘驱动器(例如C :)以找到文件(例如“ HxD.exe”),并且尝试获取该文件的特定目录以{ {1}}。我知道这个问题已经回答过了,但是我已经尝试了所有这些方法,但没有一个对我有用(嗯,一个有效,但是它给我的字符串类型无法转换为CreateProcess()正在寻找而不丢失数据)。也许我只是做错了?无论如何,如果有人知道任何可行的方法,请告诉我,那太好了。我只需要它才能在Windows上工作。 CreateProcess()

的代码
FindFirstFile()

PS:对不起,如果这是一个非常简单的修复程序,我在午夜迅速整理了一些代码,因为我将其全部删除了,而且我没有时间在b / c上查找它,我将大声笑出来。

2 个答案:

答案 0 :(得分:0)

如果使用支持C++版本的C++17编译器,则可以使用filesystem函数。如果您没有访问C ++ 17版本的权限,则可以尝试Boost库。

您可以尝试使用recursive_directory_iterator函数以递归方式迭代子目录和文件,并检查您要查找的文件是否存在。

for(auto& p: fs::recursive_directory_iterator("C:/"))
        std::cout << p.path() << '\n'

引用:

std::filesystem

boost filesystem

答案 1 :(得分:0)

您使用的FindFirstFile()完全错误。

  • (LPCWSTR)"HxD.exe"是无效的类型转换。您正在将const char[]投射到const wchar_t*。要创建适当的宽字符串文字,您需要使用L"HxD.exe"(或TEXT("HxD.exe"),因为您使用的是API的TCHAR版本)。

  • 您正在传递NULL WIN32_FIND_DATA*指针。 FindFirstFile()(和FindNextFile())期望有一个指向预先分配的WIN32_FIND_DATA实例的指针,但是您没有分配任何东西。

  • 您正在错误地检查FindFirstFile()失败。如果函数失败,返回值将为INVALID_HANDLE_VALUE。您不是要检查这种情况。

  • 最后,您要让FindFirstFile()仅在调用线程的当前工作目录中找到HxD.exe。如果实际找到该文件,则不会停止循环。实际上,当搜索特定的文件名时,FindFirstFile()会找到它,否则,FindNextFile()之后总是返回FALSE,因为给定文件夹中只有1个文件,其名称正在搜索中。因此,您的循环将变得无用。

要正确搜索整个分区,您需要让API搜索*通配符,然后为找到的每个子目录递归循环调用API,检查返回的{{1 }}表示您感兴趣的文件名的非子目录。

话虽如此,请尝试以下类似操作:

WIN32_FIND_DATA
#include <Shlwapi.h>

bool findFile(LPCWSTR path, LPCWSTR fileName, LPWSTR fullPath)
{
    WIN32_FIND_DATAW fd = {};
    DWORD dwError;

    WCHAR str[MAX_PATH] = {};
    PathCombineW(str, path, L"*");

    HANDLE hFind = FindFirstFileW(str, &fd);
    if (hFind == INVALID_HANDLE_VALUE)
    {
        dwError = GetLastError();
        if (dwError != ERROR_FILE_NOT_FOUND) 
            std::cout << "ERROR " << dwError;
        return false;
    }

    do
    {
        if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if ((lstrcmpW(fd.cFileName, L".") != 0) &&
                (lstrcmpW(fd.cFileName, L"..") != 0))
            {
                PathCombineW(str, path, fd.cFileName);
                if (findFile(str, fileName, fullPath))
                {
                    CloseHandle(hFind);
                    return true;
                }
            }
        }
        else
        {
            if ((lstrcmpiW(fd.cFileName, fileName) == 0) ||
                (lstrcmpiW(fd.cAlternateFileName, fileName) == 0))
            {
                if (fullPath)
                    PathCombineW(fullPath, path, fd.cFileName);

                CloseHandle(hFind);
                return true;
            }
        }
    }
    while (FindNextFileW(hFind, &fd));

    dwError = GetLastError();
    if (dwError != ERROR_NO_MORE_FILES) 
        std::cout << "ERROR " << dwError;

    CloseHandle(hFind);
    return false;
}

要搜索具有多个分区的整个硬盘,可以使用GetLogicalDriveStrings()

WCHAR fullPath[MAX_PATH] = {};
if (findFile(L"C:\\", L"HxD.exe", fullPath))
{
    // use fullPath as needed...
}