首页 > 解决方案 > 获取 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.exesystem 命令还能够显示其中一些与 OneDrive 相关的新文件属性(O用于脱机、U用于未固定、P用于固定)。

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

标签: winapiattributesonedriventfsreparsepoint

解决方案


来自 MSDN RtlSetThreadPlaceholderCompatibilityMode

当占位符暴露时,通过目录枚举和其他类型的文件信息查询可以清楚地看到重解析点、稀疏位和脱机位等特征。当占位符被伪装时,这些细节被完全隐藏,使文件看起来像一个普通文件。

默认情况下,大多数 Windows 应用程序都会看到暴露的占位符。出于兼容性原因,Windows 可能会决定某些应用程序默认看到伪装的占位符。

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

RtlSetThreadPlaceholderCompatibilityMode


推荐阅读