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



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

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

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

以下是通过提供的功能。NET,所以您不需要PInvoke它:

  • 同步根注册可以在中完成。NET,通过StorageProviderSyncRootManager和StorageProviderSyncRootInfo类
  • 您可以在中创建属性。NET,使用StorageProviderItemProperty类和IStorageProviderItemPropertySource接口
  • Windows文件管理器中文件和文件夹上的图标可以通过StorageProviderItemProperties进行设置。SetAsync((方法和StorageFile/StorageFolder类
  • 您可以在中读取和设置文件属性。NET使用文件。GetAttributes((/文件。SetAttributes((。您将需要它们来读取脱机属性、固定和取消固定的属性
  • 文件系统路径到URI的映射可以通过实现IStorageProviderUriSource接口来完成

以下是仅通过Win32函数提供的功能,您需要通过PInvoke:调用它

  • 文件夹按需枚举,按需文件内容加载仅通过Win32回调可用。您需要使用CfConnectSyncRoot((注册回调
  • 通过Windows资源管理器菜单进行文件水合/脱水。您需要监视文件系统并调用CfHydratePlaceholder((和CfUpdatePlaceholder
  • 下载进度报告、错误报告、Windows通知、同步提供程序状态报告。要报告进度,请使用CfReportProviderProgress((。通过CfExecute((报告错误
  • 检测是指文件是常规文件/文件夹或占位符文件/文件夹。可以通过CfGetPlaceholderStateFromFileInfo((调用来完成
  • 占位符的创建和占位符信息的更新。可以使用CfCreatePlaceholders((和CfUpdatePlaceholder((函数来完成
  • 将文件/文件夹转换为占位符并返回。可以使用CfConvertToPlaceholder((和CfRevertPlaceholder
  • 设置和读取占位符状态,例如同步/不同步。可以使用CfGetPlaceholderStateFromFileInfo((和CfGetPlaceholderInfo((来完成

以下是编写所有代码的方法。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的文件系统的更多说明:

  • ;始终保持此设备"/"释放空间";在同步根注册时自动显示。但它只设置"固定的"one_answers"未固定的"文件属性。您需要监视文件系统,检查固定/取消固定的属性,并对每个文件进行水合/脱水
  • 按需列出的文件夹是在CF_CALLBACK_TYPE_FETCH_PLACEHOLDER回调中完成的。您需要使用CfConnectSyncRoot((注册回调并在中侦听它。NET代码
  • 按需文件内容下载(水合(是在CF_CALLBACK_TYPE_FETCH_DATA回调中完成的。你需要注册并收听。NET代码