Я использую 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
Кто-нибудь может мне помочь?
Лучший.
не любые атрибуты действительны, если вы посмотрите в 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
Кажется, вы используете значение, которое не поддерживается. 0x200008 не задокументировано Microsoft.
Смотрите поддерживаемые константы: [https://msdn.microsoft.com/en-us/library/windows/desktop/gg258117(v=vs.85).aspx][1]