13

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

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

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

4

4 回答 4

9

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

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

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

视窗

云提供商 API

Windows Cloud Provider API(也称为 Cloud Files、Cloud Filter API 和 Cloud Sync Engine)在新的 Windows 驱动程序之上运行,该驱动程序作为 Windows 10 更新的一部分安装,于 2018 年发布(Windows Creator 更新)。

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

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

GitHub 上的 C++
示例 GitHub 上的 C# 示例。

投影文件系统 API

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

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

GitHub 上的 C# 示例

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

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

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

Shell 命名空间扩展

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

苹果系统

适用于 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系统扩展提供了打开/关闭事件,这需要特殊权利(例如防病毒扫描程序)。

GitHub 上 Xamarin/C# 中的示例

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

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

iOS

iOS 的文件提供程序 API

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

.NET/C# 中 GitHub 上的示例

于 2021-03-04T08:07:07.763 回答
2

刚刚找到(开心!)

多坎

于 2009-06-27T12:41:33.117 回答
1

这可能是它吗?

http://www.codeproject.com/KB/vb/QVFS.aspx

于 2009-06-21T05:03:21.603 回答
0

http://vfs.codeplex.com/http://code.google.com/p/sharpfilesystem/怎么样

于 2012-08-09T20:21:43.513 回答