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