代码之家  ›  专栏  ›  技术社区  ›  anonymous coward

在.NET中实现虚拟文件系统

  •  7
  • anonymous coward  · 技术社区  · 17 年前

    不久前,A发现了一个非常好看的框架,允许.net开发人员实现虚拟文件系统。我以为我已经把它书签了,但好像没有。

    有人知道这样做的框架吗?

    编辑: 这里有一个提示。。。它有一个吸引人的短名字和自己的域名。对不起,我只记得这些:p

    3 回复  |  直到 16 年前
        1
  •  8
  •   IT Hit WebDAV    5 年前

    在这里,我将尝试总结我在.NET中为Windows、Mac和iOS构建虚拟文件系统的知识。此摘要主要针对远程存储速度较慢的文件系统,如云存储。

    首先,让我指出,应用程序和操作系统都会对本地文件系统进行大量的读写操作,并期望它能做出非常快速的响应。因此,几乎不可能将每个文件系统调用映射到远程存储调用。即使使用非常高速的连接(或本地存储),您的虚拟文件系统也可能变得非常慢,无法使用这种设计。我想,最近的操作系统更新(2018-2021)中提供的新操作系统API,以及在此基础上创建的最终用户工具,如OneDrive,都受到这些考虑因素的指导。

    窗户

    云提供商API

    Windows Cloud Provider API

    此API提供 callbacks 对于按需文件夹列表(因此您只能加载客户端应用程序请求的服务器文件系统的一小部分)、按需文件内容下载以及用于删除和移动/重命名操作的回调。它还提供了确定文件状态的函数,您将使用这些函数来检测文件是否已在客户端上被修改并需要发送到服务器。另一个有用的功能是,它提供与Windows文件管理器的集成,显示文件状态列、文件传输进度,并将文件下载事件发布到Windows操作中心面板。该API不需要管理员权限,允许在普通用户下进行所有操作,包括初始文件系统装载。

    幸运的是,Windows云提供程序API提供了文件打开和关闭事件,这对于某些应用程序(如文件锁定/解锁或签出/签入)可能至关重要。与Mac OS不同,Mac OS上的打开/关闭事件仅限于某些应用程序类型,请参见下面的Mac部分。

    Example on GitHub in C++
    Example on GitHub in C#.

    投影文件系统API

    这个 Projected File System (ProjFS) 设计用于将(项目)分层数据表示为文件系统。它设计用于从高速存储器(如注册表)发布数据。

    它的主要特点是,与云提供商API不同,它隐藏了存储是远程的这一事实。它不提供任何文件状态、进度指示,也不提供任何会告诉用户这不是本地文件系统的指示。

    Example on GitHub in C#

    内核模式文件系统驱动程序和过滤器

    这是一种存在多年的传统方法。它适用于所有Windows版本,甚至在20年前发布。构建一个稳定的驱动程序需要很多特殊的内核模式开发和调试经验,防止系统崩溃,并且需要很长的开发周期。作为回报,它允许您在较低级别上100%访问所有文件系统功能。内核模式驱动程序最合适的用法可能是为本地硬件创建虚拟文件系统。

    我担心的是,在未来的Windows版本中,文件系统驱动程序/过滤器的创建可能会受到限制。下面是苹果在Mac上使用Kext驱动程序的情况。

    Shell Namespace Extensions 允许您自定义Windows文件管理器。特别是,您可以构建将显示在Windows文件管理器中的节点,这些节点的外观和行为与文件系统类似。你也可以 extend the Windows File Manager context menu

    马科斯

    Mac和系统扩展的文件提供程序API。

    File Provider API . 其主要功能类似于Windows上的云提供商API:按需文件夹列表、按需文件内容加载、文件状态(在云中/下载/在本地文件系统中、同步/修改)、Mac OS Finder集成。使用此API的应用程序在安装和使用时不需要管理员权限,可以按用户和每台机器模式安装,也可以在Apple App Store中发布。

    看起来这个API的主要问题是它不提供文件打开和文件关闭事件。如果没有这些事件,可能很难或不可能创建某些功能,例如,在打开/关闭时自动锁定/解锁或签出/签入文件。出于某种原因,Mac为用户提供打开/关闭事件 Endpoint Security 系统扩展,需要特殊权限(例如防病毒扫描程序)。

    Example on GitHub in Xamarin/C#

    Kext文件系统驱动程序(已弃用)。

    自macOS 11以来,苹果仅允许在恢复模式下在ARM机器上安装Kext驱动程序。他们也不允许进入应用商店。KEXT被DEXT和系统扩展取代。

    网间网操作系统

    iOS 11+提供 File Provider API 这类似于Mac上的文件提供程序API。苹果正试图统一API,使程序在Mac和iOS上运行,且改动最小。iOS和macOS API仍然存在一些差异,限制了为这两种操作系统创建单一的文件提供程序。

    Example on GitHub in .NET/C#

        2
  •  1
  •   jasonh    17 年前
        3
  •  1
  •   Liryna Jon Galloway    10 年前

    刚刚找到(开心!)

    Dokan

        4
  •  0
  •   Petr    13 年前