用C#在几秒钟内创建一个巨大的虚拟文件#

Seyed Vahid Hashemi 38 c# file-io

我想在几秒钟内创建一个巨大的虚拟文件,说1~2 GB.这是我用C#写的:

file.writeallbytes("filename",new byte[a huge number]);

另一种表明状态的方式如下:

long FSS = din.TotalFreeSpace;
long segments = FSS / 10000;
long last_seg = FSS % 10000;
BinaryWriter br = new BinaryWriter(fs);

for (long i = 0; i < segments; i++)
{
    br.Write(new byte[10000]);

    this.label2.Text = "segments write :" + i.ToString() + "\r\n" + "segments remain :" + ((segments-i)+1).ToString();
    Application.DoEvents();
}
br.Write(new byte[last_seg]);
this.label2.Text += "\r\nDone!";
br.Close();

其中din是磁盘信息对象

使用这两种方法,需要2分钟或更长时间才能编写如此大的虚拟文件.有没有其他更快的方法呢?

问候.

mdb.. 81

只需创建文件,寻找适当大的偏移量,然后写一个字节:

FileStream fs = new FileStream(@"c:\tmp\huge_dummy_file", FileMode.CreateNew);
fs.Seek(2048L * 1024 * 1024, SeekOrigin.Begin);
fs.WriteByte(0);
fs.Close();

这将产生一个2GB的文件,其内容基本上是不可预测的,应该可以满足您的需要.

  • 内容不可预测:执行写入时,文件将填充零.如果没有这样做,那将是一个安全问题. (7认同)
  • +1是一个非常简单的解决方案(假设虚拟内容可以)。 (2认同)
  • @RickNZ:虽然对于通用文件系统确实如此,但它不是API合同的明确部分,并且对于某些第三方网络重定向器不是这种情况. (2认同)
  • 仅供参考,这会生成一个大小为2 GiB + 1字节的文件 (2认同)

Rob Levine.. 71

如果你不关心内容,那么到目前为止我所知道的最快的方式是 - 它几乎是即时的:

private void CreateDummyFile(string fileName, long length)
{
    using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        fileStream.SetLength(length);
    }
}

  • 出于好奇,测试了`SetLength`和`Seek` +`WriteByte`方法.使用*Seek*512MB需要15秒,只需*SetLength*需要大约1秒钟.在这两种情况下,即使经过多次测试,文件也会填充NULL(而不是任意数据).不确定这是一个干净的磁盘或一些优化的零填充创建引擎盖下. (10认同)