如何在.NET中创建一个类似OneDrive的带有离线文件功能的虚拟文件系统?

10

我需要创建一个虚拟文件系统,将 Azure 应用程序服务中的文件与本地驱动器进行双向同步。我只需要同步一些文件和文件夹到本地文件系统,并且离线时可用。当用户选择“始终保留在此设备上”菜单时,文件/文件夹应该在首次访问或同步。类似于 OneDrive 的工作方式。我找到了 Microsoft CloudMirror C++ 示例,其中有一些基本的 OneDrive 功能,但它会在启动时同步所有文件,而且首次访问时没有列出/加载。

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

1个回答

14
要构建类似OneDrive的客户端,您需要使用云过滤器API创建同步提供程序,该API大多数情况下可以通过Win32进行编程(有一些例外情况,请参见下文),但您可以在.NET中构建完整的OneDrive模拟,包括“始终保留在此设备上”菜单和按需加载。
以下是可通过.NET使用的功能,因此您无需PInvoke它:
- 可以通过StorageProviderSyncRootManagerStorageProviderSyncRootInfo类在.NET中完成同步根注册。 - 您可以使用StorageProviderItemProperty类和IStorageProviderItemPropertySource接口在.NET中创建属性。 - 可以通过StorageProviderItemProperties.SetAsync()方法和StorageFile/StorageFolder类设置Windows文件管理器上文件和文件夹的图标。 - 您可以使用File.GetAttributes() / File.SetAttributes()在.NET中读取和设置文件属性。您将需要它们来读取离线属性、固定和未固定属性。 - 可以通过实现IStorageProviderUriSource接口来完成文件系统路径到URI映射。
以下是仅通过Win32函数可用的功能,您需要通过PInvoke调用它:

以下是你可以采取的方法,将所有代码编写为.NET:

  • One option is to import all required Win32 functions using extern to .NET, for example:

     [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);
    
  • Another option could be using this sample.

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

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

点击“始终保留在此设备上”/“释放空间”时,我应该监听哪个回调?我没有收到任何FileSystemWatcher回调或CF回调。 - Vivek MVK
如果向NotifyFilter添加属性会发送该事件,那么在回调中如何区分最后写入时间与属性? - Vivek MVK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接