当lpFileName为volume时,FindFirstFile返回INVALID_HANDLE_VALUE
FindFirstFile returns INVALID_HANDLE_VALUE when lpFileName is volume
有一个简短的例子:
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
但E
和F
是真实存在的体积。
我这样做是因为我需要来自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
。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 马洛克会在 C++17 年返回"invalid pointer value"吗?
- 为什么我的重载 + 运算符在返回时会产生"Invalid address specified to RtlValidateHeap"错误?
- WSARecv 有时会返回与 IOCP 端口关联的套接字的"invalid handle (error no 6)"。(C++)
- 链接器返回"relocation has an invalid symbol at symbol index..."
- 在 Windows 7 上使用 SHA2-512 (CALG_SHA_512) 会返回"Invalid Algorithm Specified"
- Cuda cudaGetTextureReference 返回"invalid texture reference"
- 为什么MBSTOWCS会返回"invalid multibyte character"