C#:在计算机中创建虚拟驱动器
Posted
技术标签:
【中文标题】C#:在计算机中创建虚拟驱动器【英文标题】:C#: Create a virtual drive in Computer 【发布时间】:2010-09-08 14:03:59 【问题描述】:有没有办法在“(我的)电脑”中创建一个虚拟驱动器并对其进行操作,有点像 JungleDisk 所做的那样?
它可能会做这样的事情:
override OnRead(object sender, Event e)
ShowFilesFromAmazon();
是否有任何 API:s 用于此?可能是写入 XML 文件或数据库,而不是真正的驱动器。
Dokan Library 似乎是最符合我的问题的答案,尽管 System.IO.IsolatedStorage 似乎是最标准化和最适合 Microsoft 环境的。
【问题讨论】:
【参考方案1】:根据您希望构建的虚拟驱动器类型,以下是最近在 Windows、macOS 和 ios 中引入的一些新 OS API。
以下一些 API 可作为 Windows 上的托管 .NET 代码使用,但许多是本机 Windows / macOS / iOS API。尽管如此,我还是能够在 .NET 和 Xamarin 应用程序中使用以下许多 API,并使用 C# 为 Windows、macOS 和 iOS 构建整个虚拟驱动器。
用于远程云存储
在 Windows 上。 Windows 10 提供 Cloud Sync Engine API 用于创建从远程位置发布数据的虚拟驱动器。它也被称为“Cloud Filter API”或“Windows Cloud Provider”。以下是它的主要特点:
按需文件夹列表。仅当客户端应用程序第一次向文件系统请求时,才会列出文件夹。不会下载文件内容,但所有文件属性(包括文件大小)都可以通过常规文件 API 在客户端上使用。 按需加载文件内容。文件内容可以通过多种模式(渐进式、流式传输模式、允许后台下载等)下载,并在应用程序发出第一个文件内容读取请求时提供给操作系统。 离线文件支持。文件可以在离线模式下编辑、固定/取消固定以及与服务器同步。 Windows 外壳集成。 Windows 文件管理器显示文件状态(修改、同步、冲突)和文件下载进度。 元数据和属性支持。自定义列可以显示在 Windows 文件管理器中,并且一些二进制元数据可以与每个文件和文件夹相关联。在 macOS 和 iOS 上。 MacOS Big Sur 和 iOS 11+ 提供了类似的 API,称为 File Provider API。它的功能类似于 Windows API 提供的功能:
按需列出文件夹。 按需加载文件内容。 离线文件支持。 文件管理器集成。在 macOS Finder 和 iOS 文件应用程序中,您可以显示文件状态(在云端、本地)。我目前不确定文件/文件夹是否可以在 macOS Finder 中显示自定义列并存储任何元数据。
用于高速本地存储
在 Windows 上。 Windows 提供 ProjFS API。它与 Cloud Sync Engine API 和 macOS/iOS File Provider API 的主要区别在于它隐藏了它是远程存储的事实。它不提供文件状态、下载进度等的任何指示。文档说它旨在以文件系统的形式“投影”分层数据。
【讨论】:
【参考方案2】:您可以使用Dokan library 创建虚拟驱动器。有一个用于与 C# 接口的 .Net 包装器。
【讨论】:
据我所知,没有办法在商业项目中使用它,它是在 LGPL 许可下的。我建议使用 WebDAV 服务器 + 内置的 Windows/Mac OS X 驱动器安装功能。可能这是实现结果的最快方法。 我认为你混合了一些东西:LGPL 与商业用途并非不兼容。您可以链接到 dll(引用它),并且仅当您对 Dokan dll 本身进行更改时,您必须发布源代码:但仅限修改后的 Dokan 库的源代码!这不是 GPL 代码的情况,对于 GPL,您必须发布 您的 整个应用程序的源代码。 Dokan 早已死去,而且漏洞百出,没有希望修复漏洞。【参考方案3】:是的,使用System.IO.IsolatedStorage中的类
【讨论】:
我不明白 IsloatedStorage 如何添加OnRead
事件并执行ShowFilesFromAmazon()
?你能给我举个例子吗?谢谢!【参考方案4】:
我的电脑的内容可以包括外壳命名空间扩展。这些 COM 对象在 Explorer 主进程中运行,许多其他 shell 扩展也是如此。将 C# 用于此类扩展是一个坏主意,因为您的扩展无法控制 Explorer.exe 可以使用的 CLR 版本。而且微软只允许每个进程有一个 CLR。
【讨论】:
我认为 .net 4.0 改变了这一点以上是关于C#:在计算机中创建虚拟驱动器的主要内容,如果未能解决你的问题,请参考以下文章
使用 System.IO.Directory.CreateDirectory 在网络驱动器中创建一个文件夹 [重复]
如何在 Windows 7 (Windows 2008 R2) 中创建 RAM 驱动器?
无法在我的逻辑驱动器中创建文件夹 - UnauthorizedAccessException: Access denied