【问题标题】:Implementing a virtual file system in .NET在 .NET 中实现虚拟文件系统
【发布时间】:2010-11-04 15:02:02
【问题描述】:

不久前,a 发现了一个漂亮的框架,它允许 .net 开发人员实现虚拟文件系统。我以为我已经为它添加了书签,但似乎我没有。

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

编辑:这里有一个提示......它有一个吸引人的短名称和它自己的域。抱歉,我只记得这些了:p

【问题讨论】:

    标签: .net filesystems virtual


    【解决方案1】:

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

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

    用于创建虚拟文件系统的新 OS API 主要依赖于同步,而不是每个操作映射,为实现按需文件夹列表、按需文件下载、删除和移动操作提供额外的钩子。

    窗口

    云提供商 API

    Windows Cloud Provider API(也称为云文件、云过滤器 API 和云同步引擎)在新的 Windows 驱动程序之上运行,该驱动程序作为 Windows 10 更新的一部分安装,于 2018 年发布(Windows Creator 更新) .

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

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

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

    投影文件系统 API

    Projected File System (ProjFS) 旨在将(项目)分层数据表示为文件系统。它旨在从高速存储(例如注册表)发布数据。

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

    Example on GitHub in C#

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

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

    我担心在未来的 Windows 版本中创建文件系统驱动程序/过滤器可能会受到限制。请参阅下面的 Apple 在 Mac 上使用 Kext 驱动程序所做的事情。

    Shell 命名空间扩展

    Windows Shell Namespace Extensions 允许您自定义 Windows 文件管理器。特别是,您可以构建将在 Windows 文件管理器中显示并在视觉上看起来和行为类似于文件系统的节点。你也可以extend the Windows File Manager context menu 使用 Shell 扩展。 Shell Extension 不是真正的文件系统,应用程序将无法将数据读/写到您的文件中(除非您在 shell 扩展下放置了一个真实的或一些虚拟的文件系统)。在许多情况下,您将在虚拟文件系统之上创建一个 Shell 扩展来扩展其功能并添加上下文菜单。

    MacOS

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

    自 macOS 11 Big Sur 以来,Apple 提供了用于与云存储同步的新 API - File Provider API。其主要功能类似于Windows上的Cloud Provider API:按需列出文件夹、按需加载文件内容、文件状态(在云端/正在下载/在本地文件系统中、同步中/已修改)、Mac OS查找器集成。使用此 API 的应用程序无需管理员权限即可安装和使用,可以按用户和按机器模式安装,也可以在 Apple App Store 中发布。

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

    Example on GitHub in Xamarin/C#

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

    自 macOS 11 起,Apple 仅允许在恢复模式下在 ARM 机器上安装 Kext 驱动程序。 App Store 中也不允许使用它们。 Kexts 被 Dexts 和系统扩展取代。

    iOS

    iOS 文件提供程序 API

    iOS 11+ 提供File Provider API,类似于 Mac 上的 File Provider API。 Apple 正在尝试统一 API 并让程序在 Mac 和 iOS 上运行,而只需进行最少的更改。 iOS 和 macOS API 仍然存在一些差异,限制了为两种操作系统创建单个文件提供程序。

    Example on GitHub in .NET/C#

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 不,不是那个,反正我去看看那个。
      • 也许您正在寻找以下之一:boxedapp.com、eldos.com、scalingweb.com。在“虚拟文件系统”的 wiki 页面上有更多链接 en.wikipedia.org/wiki/Virtual_file_system 为什么需要它?也许数据库、常规文件系统或 ramdrive 会是更好的选择?
      • 我需要它来实现一个在线驱动的东西。
      【解决方案3】:

      刚刚找到(开心!)

      Dokan

      【讨论】:

      • 非常好听,比 QVFS 还要好听。
      • 据我所知,没有办法在商业项目中使用它,它是在 LGPL 许可下的。我建议使用 WebDAV 服务器库(例如webdavsystem.com/server)+ 内置的 Windows/Mac OS X 驱动器安装功能。可能这是实现结果的最快方法。
      • LGPL 可用于商业闭源项目,不要与 GPL 混淆。
      • Dokan 的进展如何?还没有厌倦它的错误?
      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2016-03-19
      • 2012-11-08
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多