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

C++ 通过搜索硬盘来查找文件目录,c++,file,search,directory,find,C++,File,Search,Directory,Find,因此,我试图搜索特定的硬盘驱动器(例如,C:)以查找文件(如“HxD.exe”),并尝试获取该文件的特定目录,以便使用CreateProcess()启动。我知道这个问题以前已经得到了回答,但我已经尝试了所有这些方法,但没有一种对我有效(好吧,有一种方法有效,但它提供给我的字符串类型无法转换为CreateProcess()正在寻找的类型,而不会丢失数据)。也许我只是做错了?不管怎样,如果有人知道任何有用的东西,请告诉我,那太好了。我只需要它为windows工作。 FindFirstFile()的代

因此,我试图搜索特定的硬盘驱动器(例如,C:)以查找文件(如“HxD.exe”),并尝试获取该文件的特定目录,以便使用
CreateProcess()
启动。我知道这个问题以前已经得到了回答,但我已经尝试了所有这些方法,但没有一种对我有效(好吧,有一种方法有效,但它提供给我的字符串类型无法转换为
CreateProcess()
正在寻找的类型,而不会丢失数据)。也许我只是做错了?不管怎样,如果有人知道任何有用的东西,请告诉我,那太好了。我只需要它为windows工作。 FindFirstFile()的代码

LPWIN32\u FIND\u DATA fd=0;
句柄findFile=0;
做
{
findFile=FindFirstFile((LPCWSTR)“HxD.exe”,fd);
如果(fd==0)
{

std::cout如果您使用的是支持
C++
版本的
C++
编译器,您可以使用
文件系统
函数。如果您没有访问C++17版本的权限,您可以尝试
Boost

您可以尝试使用
recursive\u directory\u iterator
函数递归迭代子目录和文件,并检查您要查找的文件是否存在

for(auto&p:fs::recursive\u directory\u迭代器(“C:/”)
std::您是否使用了
FindFirstFile()
全部错误。
  • (LPCWSTR)“HxD.exe”
    是无效的类型转换。您正在将
    const char[]
    转换为
    const wchar\u t*
    。若要生成正确的宽字符串文字,需要使用
    L“HxD.exe”
    (或
    TEXT(“HxD.exe”)
    ,因为您使用的是
    TCHAR
    版本的API)

  • 您正在传递一个空的
    WIN32\u FIND\u DATA*
    指针。
    FindFirstFile()
    (和
    FindNextFile()
    )需要一个指向预先分配的
    WIN32\u FIND\u DATA
    实例的指针,但您没有分配任何内容

  • 您正在检查
    FindFirstFile()
    错误。如果函数失败,返回值将
    无效\u HANDLE\u value
    。您没有检查该情况

  • 最后,您要求
    FindFirstFile()
    仅在调用线程的当前工作目录中查找
    HxD.exe
    。如果确实找到了文件,则不会停止循环。事实上,在搜索特定文件名时,
    FindFirstFile()
    将找到或不找到它,并且
    FindNextFile()
    之后将始终返回FALSE,因为给定文件夹中只能有一个文件的名称被搜索。因此,循环将变得无用

要正确搜索整个分区,您需要让API搜索通配符,然后在递归循环中为找到的每个子目录调用API,检查返回的
WIN32\u FIND\u数据
,查找您感兴趣的文件名的非子目录

话虽如此,请尝试以下方式:

#包括
bool findFile(LPCWSTR路径、LPCWSTR文件名、LPWSTR完整路径)
{
WIN32_FIND_DATAW fd={};
德沃德误差;
WCHAR str[MAX_PATH]={};
路径组合视图(str,path,L“*”);
HANDLE hFind=FindFirstFileW(str和fd);
if(hFind==无效的句柄值)
{
dwError=GetLastError();
if(dwError!=未找到错误文件)

std::cout虽然这是有用的信息,但它实际上根本没有解决OP的问题。我同意。我想我可能可以说服@jacob忽略windows api方法来做更好的事情。:)OP正在努力解决字符编码问题。如果你想帮上忙,请确保你在windows上使用了理智的替代方法(
L“C:&
std::wcout
)。
LPWIN32_FIND_DATA fd = 0;
    HANDLE findFile = 0;

    do
    {
        findFile = FindFirstFile((LPCWSTR)"HxD.exe", fd);

        if (fd == 0)
        {
            std::cout << "ERROR " << GetLastError();
            // prints "ERROR 2"
        }

    } while (FindNextFile(findFile, fd));

    CloseHandle(findFile);