Win32 API中GetFileAttributesW()返回未文档化值17的问题排查
问题解释与解决方案
核心原因
返回值17是两个文件属性常量的按位组合结果:
FILE_ATTRIBUTE_READONLY(值为1,0x01):表示目录被标记为只读FILE_ATTRIBUTE_DIRECTORY(值为16,0x10):表示目标是目录
Windows文件属性是按位存储的标志位,多个属性会通过按位或合并成一个数值返回,而非单一常量值。所以17 = 1 + 16,完全符合API的设计逻辑。
验证与正确用法
不要直接将返回值与单一常量比较,应该用按位与操作判断每个属性是否存在。修改代码中的属性判断逻辑如下:
DWORD fileAttribute = GetFileAttributesW(*(dir + 1)); if (fileAttribute == INVALID_FILE_ATTRIBUTES) { // 处理错误 DWORD err = GetLastError(); wprintf(L"Error: %lu\n", err); } else { // 判断是否是目录 if (fileAttribute & FILE_ATTRIBUTE_DIRECTORY) { wprintf(L"This is a directory\n"); } // 判断是否是只读 if (fileAttribute & FILE_ATTRIBUTE_READONLY) { wprintf(L"This item is read-only\n"); } // 用十六进制打印属性值,更易识别位标志组合 wprintf(L"Raw attributes (hex): 0x%X\n", fileAttribute); }
补充说明
- 系统默认的用户下载文件夹通常会被标记为只读,这是Windows的常见行为,因此会同时返回目录和只读属性。
GetLastError()返回ERROR_SUCCESS说明API调用完全正常,返回的属性值是有效的。
内容的提问来源于stack exchange,提问作者Gregor Hartl Watters
相关产品推荐
相关产品推荐

