【问题标题】:How to create a virtual file system with offline files (similar to OneDrive) in .NET?如何在 .NET 中创建带有脱机文件(类似于 OneDrive)的虚拟文件系统?
【发布时间】:2020-09-25 05:06:43
【问题描述】:

我需要创建一个虚拟文件系统,将文件从我的 Azure 应用服务同步到本地驱动器并向后同步。我只需要将一些文件和文件夹同步到我的本地文件系统并可以脱机使用。文件/文件夹应在首次访问期间或当用户选择“始终保留在此设备上”菜单时同步。类似于 OneDrive 的做法。我发现了 Microsoft CloudMirror C++ 示例,它具有一些基本的 OneDrive 功能,但它在启动期间会同步所有文件,并且在首次访问时不会列出/加载。

是否可以完全在.NET中构建具有上述功能的虚拟文件系统?

【问题讨论】:

  • 你可以使用这个商业产品shellboost.com(免责声明:我为开发它的公司工作)

标签: c# .net filesystems onedrive virtualfilesystem


【解决方案1】:

要构建类似 OneDrive 的客户端,您需要使用云过滤 API 创建同步提供程序,该 API 主要可通过 Win32 进行编程(有一些例外,见下文),但您可以在 .NET 中构建完整的 OneDrive 模拟,包括“始终保持在此设备上”菜单和按需加载。

以下是可通过 .NET 获得的功能,因此您无需 PInvoke:

这里的功能只能通过 Win32 函数获得,您需要通过 PInvoke 调用它:

以下是在 .NET 中编写所有代码的方法:

  • 一种选择是import all required Win32 functions 使用extern to .NET,例如:

     [DllImport("cldapi.dll", SetLastError = true, ExactSpelling = true)]
     public static extern int CfGetPlaceholderStateFromFileInfo(IntPtr infoBuffer, FILE_INFO_BY_HANDLE_CLASS infoClass);
    
     [DllImport("cldapi.dll", SetLastError = true, ExactSpelling = true)]
     public static extern HRESULT CfSetPinState(IntPtr fileHandle, int pinState, int pinFlags, IntPtr overlapped);
    
  • 另一个选项可能是using this sample

关于构建类似 OneDrive 的文件系统的更多注意事项:

  • “始终保留在此设备上”/“释放空间”会在同步根注册时自动显示。但它只设置固定和未固定的文件属性。您需要监控文件系统,检查固定/取消固定的属性,并对每个文件进行水合/脱水。
  • 按需文件夹列表在 CF_CALLBACK_TYPE_FETCH_PLACEHOLDERS 回调中完成。您需要使用CfConnectSyncRoot() 注册回调并在.NET 代码中进行监听。
  • 按需文件内容下载(水合)在 CF_CALLBACK_TYPE_FETCH_DATA 回调中完成。您需要在 .NET 代码中注册并收听。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多