如何使用 .Net 直接写入磁盘?

Posted

技术标签:

【中文标题】如何使用 .Net 直接写入磁盘?【英文标题】:How do I write to a disk directly with .Net? 【发布时间】:2014-11-23 13:53:00 【问题描述】:

我找到了一种从驱动器读取的方法,使用 Darryl Braaten 发布的方法 How do I read a disk directly with .Net?

我现在正试图找到一种在驱动器上写入的方法,而在他的方法中,写入方法没有实现。任何人都可以提出一种方法吗?

感谢您的宝贵时间。

【问题讨论】:

导入和使用WriteFile() 函数(与那里使用的ReadFile() 相当对称)。如果您的代码有任何问题,请不要再回来... 我得到一个 Stream is not writable ,即使我将处理程序设置为 GENERIC_READ | GENERIC_WRITE 和 Filestream 到 FileAccess.ReadWrite。知道为什么我会收到这个错误吗? 【参考方案1】:

只需使用WriteFile P/Invoke 函数:

[DllImport("kernel32.dll", SetLastError=true)]
static extern bool WriteFile(
    IntPtr hFile, 
    byte[] lpBuffer, 
    uint nNumberOfBytesToWrite, 
    out uint lpNumberOfBytesWritten,
    IntPtr lpOverlapped);

ReadFile 调用替换为WriteFile,这非常简单。请记住:

您使用CreateFile 获得的句柄具有write 访问权限 你必须为每个块写入字节;块大小必须是扇区大小的倍数。 IE。如果您只想写入 1 个字节,则必须读取整个扇区,修改内存中的字节,然后写回整个扇区

【讨论】:

我已将句柄设置为 GENERIC_READ | GENERIC_WRITE 和 Filestream FileAccess.ReadWrite,但我得到“流不可写”。错误。

以上是关于如何使用 .Net 直接写入磁盘?的主要内容,如果未能解决你的问题,请参考以下文章

使用C直接读/写磁盘[重复]

如何直接从 ZipEntry(RubyZip、Paperclip、Rails 3)获取临时文件对象(内容类型正确,无需写入磁盘)?

如何在 C# 中清空/刷新 Windows READ 磁盘缓存?

你如何在 Java 中写入磁盘(使用刷新)并保持性能?

如何使用 libtorrent 下载完全跳过将文件写入磁盘?

如何在不写入磁盘的情况下将 XML 从 Delphi 传递到 C#?