因此,我尝试搜索特定的硬盘驱动器(例如C :)以找到文件(例如“ HxD.exe”),并且尝试获取该文件的特定目录以{ {1}}。我知道这个问题已经回答过了,但是我已经尝试了所有这些方法,但没有一个对我有用(嗯,一个有效,但是它给我的字符串类型无法转换为CreateProcess()
正在寻找而不丢失数据)。也许我只是做错了?无论如何,如果有人知道任何可行的方法,请告诉我,那太好了。我只需要它才能在Windows上工作。
CreateProcess()
FindFirstFile()
PS:对不起,如果这是一个非常简单的修复程序,我在午夜迅速整理了一些代码,因为我将其全部删除了,而且我没有时间在b / c上查找它,我将大声笑出来。
答案 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'
引用:
答案 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...
}