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

RtlSetThreadPlaceholderCompatibilityMode

Другие вопросы по тегам