设置文件属性成功但检索失败

Set File attribute succed but retriving it fails

我使用 SetFileAttributesW 来设置自定义文件属性,例如0x200008,而SetFileAttributesWreturns非零表示没有错误。但 GetFileAttributesW 检索忽略设置属性的文件属性。

int main()
{
    uint32_t magic = 0x200008;
    DWORD attribute = GetFileAttributesW(L"test");
    cout << attribute << endl;
    if ((attribute & magic) == magic)
        cout << "has magic" << endl;
    else
    {
        attribute |= magic;
        cout << attribute << endl;
    }
    cout << SetFileAttributesW(L"test", attribute) << " " << GetLastError();
    cin.get();
    return 0;
}

以及每个 运行
的输出 32
2097192
1 0

谁能帮帮我?

最佳。

没有任何属性有效,如果您查看 wmd.h,您可以找到下一个定义:

#if (_WIN32_WINNT < _WIN32_WINNT_WIN8)

#define FILE_ATTRIBUTE_VALID_FLAGS          0x00007fb7
#define FILE_ATTRIBUTE_VALID_SET_FLAGS      0x000031a7

#else

#define FILE_ATTRIBUTE_VALID_FLAGS          0x0002ffb7
#define FILE_ATTRIBUTE_VALID_SET_FLAGS      0x000231a7

#endif

因此您的自定义文件属性 0x200008 无效并且将是未定义的行为。然而,在当前的实现中,文件系统会忽略它们不理解的任何值,而是 return 错误 见 FASTFAT source:

    //
    //  Only permit the attributes that FAT understands.  The rest are silently
    //  dropped on the floor.
    //



    Attributes = (UCHAR)(Buffer->FileAttributes & (FILE_ATTRIBUTE_READONLY |
                                                   FILE_ATTRIBUTE_HIDDEN |
                                                   FILE_ATTRIBUTE_SYSTEM |
                                                   FILE_ATTRIBUTE_DIRECTORY |
                                                   FILE_ATTRIBUTE_ARCHIVE));

NTFS 做同样的事情。

所以只使用在 windows 头文件和掩码 FILE_ATTRIBUTE_VALID_SET_FLAGS

中声明的属性

您似乎使用了不受支持的值。 Microsoft 未记录 0x200008。

查看支持的常量:[https://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx][1]