如何在 .NET 中创建具有脱机文件(类似于 OneDrive)的虚拟文件系统?

And*_*y Y 7 .net c# filesystems virtualfilesystem onedrive

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

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

Dim*_*rin 9

要构建类似 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);
    
    Run Code Online (Sandbox Code Playgroud)
  • 另一种选择是使用此示例

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

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