有一个简短的例子:
WIN32_FIND_DATA fd;
HANDLE h = FindFirstFile(L"C:", &fd);
if (h == INVALID_HANDLE_VALUE)
{
wprintf(L"Err = %d\n", GetLastError());
return 1;
}
do {
std::wstring fullPath(fd.cFileName);
wprintf(L"FullPath = %s\n", fullPath.c_str());
} while (FindNextFile(h, &fd));
FindClose(h);
我很困惑,因为
HANDLE h = FindFirstFile(L"C:", &fd); // OK
HANDLE h = FindFirstFile(L"E:", &fd); // INVALID_HANDLE_VALUE
HANDLE h = FindFirstFile(L"F:", &fd); // INVALID_HANDLE_VALUE
但E
和F
是真实的现有卷。
我这样做是因为我需要来自WIN32_FIND_DATA
结构的所有信息,这些信息将被传递给内核模式。
答案 0 :(得分:1)
这个问题似乎是基于一种误解。你说:
我不想检查" E:*"中的文件和目录,我想获得有关此卷的信息。
和
我需要WIN32_FIND_DATA结构中的所有信息。
嗯,查找数据信息对文件和目录对象有意义,但对卷对象则没有意义。
您需要使用其他方法来获取音量信息。也许GetVolumeInformation
,WMI,或者其他可能取决于您的需求。
答案 1 :(得分:0)
我认为你不得不把"E:\\*"
放在音量上。或者你想找到卷条目?此外,最好清除fd
结构memset( &fd, 0, sizeof fd )
。
答案 2 :(得分:0)
在我的机器上(Win7 x64)FindFirstFile(L"C:", &fd)
返回-1(C:
是系统光盘),GetLastError()
是2(即“找不到文件”)。
我已查看FindFirstFile
的工作原理。它使用RtlDosPathNameToRelativeNtPathName_U
在某个阶段将winapi路径转换为nt路径,然后检查PartName
是否为空。
如果它为空,则返回提到的错误代码。
如果它是一个掩码,它会继续并枚举匹配的条目:这就是FindFirstFile(L"C:\\*.*", &fd)
返回有效句柄的原因。因此,如果您需要使用表单C:
枚举C:\\*.*
中的所有文件。
如果您需要卷信息,请使用特殊功能GetVolumeInformation
。