当lpFileName为volume时,FindFirstFile返回INVALID_HANDLE_VALUE

FindFirstFile returns INVALID_HANDLE_VALUE when lpFileName is volume

本文关键字:INVALID 返回 HANDLE VALUE FindFirstFile lpFileName volume      更新时间:2023-10-16

有一个简短的例子:

WIN32_FIND_DATA fd;
HANDLE h = FindFirstFile(L"C:", &fd);
if (h == INVALID_HANDLE_VALUE)
{
    wprintf(L"Err = %dn", GetLastError());
    return 1;
}
do {
    std::wstring fullPath(fd.cFileName);
    wprintf(L"FullPath = %sn", 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

EF是真实存在的体积。

我这样做是因为我需要来自WIN32_FIND_DATA结构的所有信息,这些信息将传递到内核模式。

这个问题似乎是基于一个误解。你说:

我不想检查"E:*"中的文件和目录,我想获得有关该卷的信息。

我需要WIN32_FIND_DATA结构的所有信息。

查找数据信息对文件和目录对象有意义,但对卷对象没有意义。

您需要使用其他方法来获取卷信息。可能是GetVolumeInformation, WMI,或者根据您的需要可能是其他东西。

我认为你必须把"E:\*"不仅音量。或者你想找到体积项?此外,最好清理fd结构memset( &fd, 0, sizeof fd )

在我的机器上(Win7 x64) FindFirstFile(L"C:", &fd)返回-1 (C:是系统盘),GetLastError()是2(即。"文件未找到").

我已经检查了FindFirstFile是如何工作的。它在某个阶段使用RtlDosPathNameToRelativeNtPathName_U将winapi类路径转换为nt路径,然后检查PartName是否为空。

如果为空,则返回上述错误代码。

如果是掩码,它继续枚举匹配的条目:这就是为什么FindFirstFile(L"C:\*.*", &fd)返回有效句柄。因此,如果您需要使用C:\*.* .

形式枚举C:中的所有文件。

如果您需要卷信息,请使用特殊功能GetVolumeInformation