C# 当长度以GB为单位时,FileStream.SetLength(long length)太慢

C# 当长度以GB为单位时,FileStream.SetLength(long length)太慢,c#,performance,file-io,C#,Performance,File Io,我需要编写一个小工具来消耗磁盘的可用空间(只留下几千字节),以测试一些“磁盘空间不足”的用例。守则: new FileStream(filename).SetLength(remaining free bytes - 1024); //leaving 1KB's free space 但是FileStream.SetLength(long-length)如果长度以GB为单位,则速度太慢,与将大型高清电影复制到磁盘一样慢。(编辑:很抱歉,我只是意识到我只有在写入可移动闪存时才会遇到这种情况,如

我需要编写一个小工具来消耗磁盘的可用空间(只留下几千字节),以测试一些“磁盘空间不足”的用例。守则:

new FileStream(filename).SetLength(remaining free bytes - 1024); //leaving 1KB's free space 
但是
FileStream.SetLength(long-length)
如果长度以GB为单位,则速度太慢,与将大型高清电影复制到磁盘一样慢。(编辑:很抱歉,我只是意识到我只有在写入可移动闪存时才会遇到这种情况,如果写入其他本地驱动器,速度足够快。

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

您可以创建大文件,而无需通过Windows API调用写入这些文件


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

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


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

在谷歌搜索后,我被引导到这个问题:


这回答了我的问题。

在谷歌搜索之后,我被引导到这个问题:


这就回答了我的问题。

为什么您希望它更快?为什么不创建一个具有非常小的磁盘的虚拟机并在其上进行测试?此外,您的方法甚至可能不可行,这取决于磁盘的碎片。@leppie,因为我认为与将字节从源文件复制到新文件不同,我需要的只是一个占用磁盘空间的空白文件,没有缓冲区读/写操作,这就是我希望它更快的原因。@kennyzx:读取速度比正常写入速度快,所以这永远不会成为瓶颈。除了使用Matthew Watson所说的以外。为什么您希望它更快?为什么不创建一个具有非常小的磁盘的VM并在其上进行测试?此外,您的方法甚至可能不可行,这取决于磁盘的碎片。@leppie,因为我认为与将字节从源文件复制到新文件不同,我需要的只是一个占用磁盘空间的空白文件,没有缓冲区读/写操作,这就是我希望它更快的原因。@kennyzx:读取速度比正常写入速度快,所以这永远不会成为瓶颈。除了使用Matthew Watson所说的以外。看起来很有希望,我稍后会尝试看看区别。不幸的是,该应用程序需要SE_MANAGE_VOLUME_NAME权限才能调用此API。。。这是一个普通的应用程序所没有的。看起来很有希望,我稍后会尝试看看区别。不幸的是,该应用程序需要SE_MANAGE_VOLUME_NAME权限才能调用此API。。。这是正常人所没有的。