当lpFileName是volume时,FindFirstFile返回INVALID_HANDLE_VALUE

时间:2015-10-08 10:37:35

标签: c++ winapi

有一个简短的例子:

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

EF是真实的现有卷。

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

3 个答案:

答案 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