Получение полных атрибутов файлов для файлов, управляемых Microsoft OneDrive
Microsoft OneDrive позволяет хранить файлы локально, удаленно или обоими способами. Это определяется новыми атрибутами файлов, которые появились в Windows 10:
FILE_ATTRIBUTE_PINNED 0x00080000
FILE_ATTRIBUTE_UNPINNED 0x00100000
FILE_ATTRIBUTE_RECALL_ON_OPEN 0x00040000
FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS 0x00400000
а также некоторые атрибуты файлов, унаследованные от предыдущих версий Windows:
FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
FILE_ATTRIBUTE_OFFLINE 0x00001000
Проблема в том, что я не могу найти способ получить эти новые атрибуты файла через Win32 API или NT Native API. Я пробовал до сих пор:
GetFileAttributes()
FindFirstFile()
NtQueryAttributesFile()
Для файла OneDrive, для которого было задано постоянное хранение, все эти методы возвращают 0x00500020, в то время как истинные атрибуты - 0x00501620 (REPARSE_POINT, SPARSE_FILE и OFFLINE замаскированы). Истинные атрибуты файла можно получить с помощью следующей команды PowerShell:
[Convert]::ToString( (Get-ItemProperty -Path 'C:\Users\username\OneDrive\test.txt').Attributes.Value__, 16 )
attrib.exe
Системная команда также может отображать некоторые из этих новых атрибутов файлов, связанных с OneDrive (O
для оффлайн, U
для не закрепленного, P
для закрепленного).
Есть ли способ получить эти атрибуты файлов в моем программном обеспечении? Может быть, мне нужно что-то добавить в манифест?
1 ответ
Из MSDN RtlSetThreadPlaceholderCompatibilityMode
Когда выставляются заполнители, такие характеристики, как наличие точки повторной обработки, разреженного бита и автономного бита, отчетливо видны через перечисление каталогов и другие типы запросов информации о файлах. Когда заполнители замаскированы, эти детали полностью скрыты, что делает файл похожим на обычный файл.
Большинство приложений Windows видят открытые заполнители по умолчанию. По причинам совместимости Windows может решить, что определенные приложения видят замаскированные заполнители по умолчанию.
Я предполагаю, что Windows поместила вашу тестовую программу в какой-то режим совместимости и поэтому фильтрует атрибуты.