我想在几秒钟内创建一个巨大的虚拟文件,比如 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 分钟或更多分钟。还有其他更快的方法吗?
只需创建文件,寻找适当大的偏移量,然后写入单个字节:
FileStream fs = new FileStream(@"c:\tmp\huge_dummy_file", FileMode.CreateNew);
fs.Seek(2048L * 1024 * 1024, SeekOrigin.Begin);
fs.WriteByte(0);
fs.Close();
这将产生一个 2GB 的文件,其中内容基本上是不可预测的,这应该可以满足您的目的。
如果你不关心内容,那么到目前为止我所知道的最快的方法就是这个 - 它几乎是即时的:
private void CreateDummyFile(string fileName, long length)
{
using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
{
fileStream.SetLength(length);
}
}
如果您只需要
FileStream
,则可以使用 FileStream.SetLength
。这将为您提供 2 GB 长的流。然后您可以在您选择的任意位置写入最终字节。但内容将是未定义的。
如果您尝试在磁盘上实际创建文件,是的,您需要实际写入其内容。是的,硬盘会变慢;像 1 GB/分钟这样的写入速度并不是完全荒谬的。抱歉——这就是物理学!
为什么不使用
BackgroundWorker
类来实现此目的,因为您可以将任何内容传递到 ReportProgress
方法中来指示状态报告。请参阅下面的示例:
私有BackgroundWorker bgWorker; 公共表格1() { 初始化组件(); bgWorker = 新的BackgroundWorker(); bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork); bgWorker.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgressChanged); bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted); bgWorker.RunWorkerAsync(); } void bgWorker_RunWorkerCompleted(对象发送者,RunWorkerCompletedEventArgs e) { this.label2.Text = "完成"; } void bgWorker_ProgressChanged(对象发送者,ProgressChangedEventArgs e) { MyStatus myProgressStatus = (MyStatus)e.UserState; this.label2.Text = string.Format("分段写入:{0}" + Environment.Newline + "剩余分段:{1}", myProgressStatus.iWritten, myProgressStatus.iRemaining); } void bgWorker_DoWork(对象发送者, DoWorkEventArgs e) { 长 FSS = din.TotalFreeSpace; 长段 = FSS / 10000; 长last_seg = FSS % 10000; BinaryWriter br = new BinaryWriter(fs); 对于 (长 i = 0; i < segments; i++) { br.Write(new byte[10000]); bgWorker.ReportProgress(i.ToString(), new MyStatus(i, ((segments-i) + 1))); } br.Write(new byte[last_seg]); br.Close(); } public class MyStatus{ public int iWritten; public int iRemaining; public MyStatus(int iWrit, int iRem){ this.iWritten = iWrit; this.iRemaining = iRem; } } }
这是一个草稿...
我可能是错的,但你可能会发现不可能那么快地创建这么大的文件,因为 I/O 写入过程中会出现瓶颈。
但是,在上面的代码中,Applciation.DoEvents 会减慢速度。此外,对 screenthis.label2.Text = 的任何重新绘制都会导致速度稍微减慢。
创建一个 1 GiB 文件。
string testfile = "hello";
var content = new byte[1024L * 1024 * 1024];
Random random = new Random();
random.NextBytes(content);
File.WriteAllBytes(testfile, content);