【问题标题】:FileStream.SetLength(long length) too slow when length is in gigabytes当长度以千兆字节为单位时,FileStream.SetLength(long length) 太慢
【发布时间】:2012-12-05 09:10:15
【问题描述】:

我需要编写一个小工具来消耗磁盘的可用空间(仅留下几个 Kilo 字节)来测试一些“磁盘空间不足”的用例。代码:

new FileStream(filename).SetLength(remaining free bytes - 1024); //leaving 1KB's free space 

FileStream.SetLength(long length) 的长度以千兆字节为单位太慢,就像将大高清电影复制到磁盘一样慢。 (编辑:对不起,我才意识到我只有在写入可移动闪存时才会遇到这种情况,如果写入其他本地驱动器,速度就足够快了。

所以我想知道,有没有更快的方法来写入空白文件(即用零填充)?也欢迎使用 C/C++ 编写代码。 还是有其他技巧可以测试“磁盘空间不足”的情况而无需编写空白文件?

【问题讨论】:

  • 你为什么希望它更快?
  • 为什么不创建一个具有非常小的磁盘的虚拟机并在其上进行测试?
  • 另外,您的方法甚至可能不可行,具体取决于磁盘的碎片。
  • @leppie 因为我认为与将字节从源文件复制到新文件不同,我需要的只是一个占用磁盘空间的空白文件,没有缓冲区读/写操作,这就是我期望它的原因更快。
  • @kennyzx:读取比正常写入快,所以这永远不会成为瓶颈。除了使用 Matthew Watson 所说的话。

标签: c# performance file-io


【解决方案1】:

您可以通过 Windows API 调用 SetFileValidData 创建大文件而无需写入它们。

但是,请注意,它不会用零填充文件(这就是它更快的原因)。另外,请仔细阅读该功能的文档,因为这会涉及安全问题。

【讨论】:

  • 看起来很有希望,我稍后会尝试看看有什么不同。
  • 不幸的是,该应用程序需要 SE_MANAGE_VOLUME_NAME 权限才能调用此 API……这是普通应用程序所没有的。
【解决方案2】:

在谷歌搜索后,我被引导到这个 SO 问题: Creating big file on Windows

这回答了我的问题。

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多