winapi - 获取 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
system 命令还能够显示其中一些与 OneDrive 相关的新文件属性(O
用于脱机、U
用于未固定、P
用于固定)。
有没有办法在我的软件中检索这些文件属性?也许我需要在清单中添加一些东西?
解决方案
来自 MSDN RtlSetThreadPlaceholderCompatibilityMode
当占位符暴露时,通过目录枚举和其他类型的文件信息查询可以清楚地看到重解析点、稀疏位和脱机位等特征。当占位符被伪装时,这些细节被完全隐藏,使文件看起来像一个普通文件。
默认情况下,大多数 Windows 应用程序都会看到暴露的占位符。出于兼容性原因,Windows 可能会决定某些应用程序默认看到伪装的占位符。
我猜测 Windows 已将您的测试程序置于某种兼容模式,因此正在过滤属性。
推荐阅读
- ubuntu - 代客泊车状态显示“已停止”
- javascript - 如何将数据从 vue 组件传递到 laravel 中的视图(HTML)
- mysql - 将查询结果选择到新列中
- domain-driven-design - 在会议管理中使用单独的有界上下文人员管理(演讲者、主席、作者、参与者)?
- node.js - 为什么在终端中 console.log 时我的数组被包装?
- 3d - 有没有更简单的方法在 PPT 或 Visio 中创建附图?
- php - 从 PHP 处理提交 AJAX 时,下面的代码中有什么错误?
- c# - 超时后重新连接到 TCP 客户端
- bash - 将命令应用于文本文件中列的值并替换
- ruby-on-rails - Rails 中的自引用关联