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,而true属性为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
当暴露占位符时,通过目录枚举和其他类型的文件信息查询,可以清楚地看到诸如重新分析点,稀疏位和脱机位等特征。当占位符被伪装时,这些细节被完全隐藏,使文件看起来像普通文件。
大多数Windows应用程序默认情况下看到暴露的占位出于兼容性原因,Windows可能会决定某些应用程序默认情况下会看到伪装的占位符。
我猜测Windows已将您的测试程序置于某种兼容模式,因此会过滤属性。