Задать атрибут файла успешно, но получить его не удалось

Я использую SetFileAttributesW для установки атрибута обычного файла, например 0x200008, и SetFileAttributesW возвращает ненулевое значение, что означает отсутствие ошибки. но 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

Кто-нибудь может мне помочь?

Лучший.

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 недопустим и будет иметь неопределенное поведение. однако в текущей реализации файловые системы игнорируют любые значения, которые они не понимают, вместо этого возвращают ошибку
Увидеть FASTFAT источник:

    //
//  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

1

Другие решения

Кажется, вы используете значение, которое не поддерживается. 0x200008 не задокументировано Microsoft.

Смотрите поддерживаемые константы: [https://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx][1]

0

По вопросам рекламы [email protected]