【发布时间】:2010-11-26 20:03:01
【问题描述】:
我希望能够直接从磁盘读取和写入数据(即在扇区/群集级别),但我还没有在 windows 下找到合适的工具来执行此操作。
我一直试图弄清楚如何用 C# 编写自己的文档,但我发现的文档很少,而且只涉及 C++ API。
在 C# 中直接读取/写入驱动器的最佳方式是什么? (或者任何人都可以向我推荐一个允许我直接从驱动器读取/写入的工具吗?)
【问题讨论】:
我希望能够直接从磁盘读取和写入数据(即在扇区/群集级别),但我还没有在 windows 下找到合适的工具来执行此操作。
我一直试图弄清楚如何用 C# 编写自己的文档,但我发现的文档很少,而且只涉及 C++ API。
在 C# 中直接读取/写入驱动器的最佳方式是什么? (或者任何人都可以向我推荐一个允许我直接从驱动器读取/写入的工具吗?)
【问题讨论】:
pinvoke.net 拥有一系列托管代码包装器,适用于基本上所有 Win32 API,包括那些可以与磁盘管理器服务对话并执行低级内核/IO 的代码。
【讨论】:
CreateFile。这里有一个托管流包装器示例:How do I read a disk directly with .NET.
老实说,如果您想用 C# 编写此代码,您可能需要查看 Platform Invoke。它允许您与非托管平台 API 进行交互,您提到的是到目前为止您找到的大部分信息 :-)
【讨论】:
这个问题是在搜索与 .NET 中的块设备写入相关的术语时出现的,所以我想用一些直接链接来修饰原始答案。
首先,您将使用 PInvoke 来 CreateFile 获取文件句柄。
PInvoke 方法用于将 CreateFile 导入 .NET 环境。 MSDN 在SafeFileHandle 的讨论中有一个示例。如果要为 CreateFile 的参数和返回码创建 c# 类型,PInvoke 上有一些示例
但是,您需要决定是要写入物理设备还是其上的卷。卷对应于设备上的分区。例如。 “\.\PhysicalDrive0”是物理设备,而“\.\C:”是卷。
有关可用 Win32 设备的详细信息,请在这些 Win32 设备上使用 QueryDosDevice 的 C# 版本背景,它们的命名转换和与 O/S 对象的关系可以在 Mark Russinovich 的“Windows Internals”中找到。
【讨论】: