Получение полных атрибутов файлов для файлов, управляемых Microsoft OneDrive - PullRequest
0 голосов
/ 06 февраля 2019

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 Ответ

0 голосов
/ 16 февраля 2019

Из MSDN RtlSetThreadPlaceholderCompatibilityMode

Когда выставляются заполнители, такие характеристики, как наличие точки повторной обработки, разреженного бита и автономного бита, отчетливо видны через перечисление каталогов и другие типы информации о файлезапросы.Когда заполнители замаскированы, эти данные полностью скрыты, поэтому файл выглядит как обычный файл.

Большинство приложений Windows по умолчанию видят открытые заполнители.По соображениям совместимости Windows может решить, что определенные приложения видят замаскированные заполнители по умолчанию.

Я предполагаю, что Windows поместила вашу тестовую программу в какой-то режим совместимости и поэтому фильтрует атрибуты.

RtlSetThreadPlaceholderCompatibilityMode

...