如何检测OneDrive仅在线文件

时间:2018-03-15 14:22:09

标签: winapi onedrive

从Windows 10 Fall Creators Update(版本16299.15)和OneDrive版本17.3.7064.1005开始,按需文件可供用户使用(https://support.office.com/en-us/article/learn-about-onedrive-files-on-demand-0e6860d3-d9f3-4971-b321-7092438fb38e

现在,任何OneDrive文件都可以具有以下类型之一:仅限在线,本地可用且始终可用。

使用WinAPI我如何知道该文件(例如" C:\ Users \ Username \ OneDrive \使用OneDrive.pdf和#34开始;)是否为在线文件?

3 个答案:

答案 0 :(得分:3)

要检查“仅限在线”,您只需拨打GetFileAttributes()并查看FILE_ATTRIBUTE_OFFLINE属性是否已设置。

事实上,这对于OneDrive来说并不新鲜,该属性已经存在了很长时间。

通过shell可以使用其他OneDrive属性(尽管您需要的属性是PKEY_StorageProviderState而不是PKEY_FilePlaceholderStatus),但“仅限在线”很容易检查。

编辑:Windows 10的另一个文件系统属性FILE_ATTRIBUTE_PINNED 新的,并且OneDrive使用它来指示“始终可用”的文件。

修改:截至2019年,OneDrive现在似乎使用FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS而不是FILE_ATTRIBUTE_OFFLINE,如下所示。

答案 1 :(得分:1)

查看文件的PKEY_FilePlaceholderStatus属性(at the shell level,而不是文件系统级别)。 This blog post有一个可以测试的示例程序。 This question还暗示了一些您可能想要查看的未记录的属性。

Microsoft有一个UWP example on MSDN

答案 2 :(得分:0)

多年之后,我仍然使用here描述的FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS属性来确定文件或目录在本地是否完全存在。

Microsoft文档对FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS说以下内容:

设置此属性后,意味着该文件或目录在本地不完整。对于文件来说,这意味着并非其所有数据都位于本地存储中(例如,稀疏,而某些数据仍位于远程存储中)。对于目录,这意味着某些目录内容正在从另一个位置虚拟化。读取文件/枚举目录将比普通方法贵,例如它将导致至少某些文件/目录内容从远程存储中获取。只有内核模式调用者才能设置此位。

FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS有一些优点:

  1. 它可以用于文件和目录。
  2. 只能在内核模式下设置,因此任何人都没有机会随意设置属性。

正如this answer中所述,仍有一些有趣的未记录属性可以提供有关云文件的其他信息。

注意:我不接受乔纳森·波特的回答,因为我在评论中提到了FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS属性,并且比他更新答案的早一年开始使用它。