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

时间:2009-06-21 04:56:54

标签: .net filesystems virtual

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

有没有人知道这样做的任何框架?

编辑:这是一个提示......它有一个吸引人的简短名称,它是自己的域名。对不起,这就是我所能记住的:p

4 个答案:

答案 0 :(得分:8)

在这里,我将尝试总结我在 .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 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 驱动程序所做的工作。

外壳命名空间扩展

Windows Shell Namespace Extensions 允许您自定义 Windows 文件管理器。特别是,您可以构建将在 Windows 文件管理器中显示并且在视觉上看起来和行为类似于文件系统的节点。您还可以extend the Windows File Manager context menu 使用 Shell 扩展。 Shell 扩展不是真正的文件系统,应用程序将无法将数据读/写到您的文件中(除非您在您的 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#

答案 1 :(得分:4)

刚刚发现(快乐!)

Dokan

答案 2 :(得分:1)

答案 3 :(得分:0)