获取由 Microsoft OneDrive 管理的文件的完整文件属性

Getting full file attributes for files managed by 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 文件,所有这些方法 return 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 表示固定).

有没有办法在我的软件中检索这些文件属性?也许我需要在清单中添加一些东西?

来自 MSDN RtlSetThreadPlaceholderCompatibilityMode

When placeholders are exposed, characteristics such as the presence of a reparse point, the sparse bit, and the offline bit are plainly visible through directory enumeration and other types of file information queries. When placeholders are disguised, these details are completely hidden, making the file look like a normal file.

Most Windows applications see exposed placeholders by default. For compatibility reasons, Windows may decide that certain applications see disguised placeholders by default.

我猜测 Windows 已将您的测试程序置于某种兼容模式,因此正在过滤属性。

RtlSetThreadPlaceholderCompatibilityMode