9

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

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

4

1 回答 1

10

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

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

这是仅通过 Win32 函数可用的功能,您需要通过 PInvoke 调用它:

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

  • 一种选择是使用 extern将所有必需的 Win32 函数导入.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);
    
  • 另一种选择可能是使用此示例

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

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