在C#中创build一个巨大的假文件在秒的事情
我想创build一个巨大的虚拟文件,说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分钟或更长的时间才能写出如此大但虚拟的文件。 有没有其他更快的方法呢?
问候。
简单地创build文件,寻找适当的大偏移量,然后写入一个字节:
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
。 这会给你一个2GB长的stream。 然后你可以在你select的任意位置写最后的字节。 但内容将是未定义的。
如果你试图在磁盘上创build一个文件,是的,你需要真正写下它的内容。 是的,硬盘将会变慢。 像1 GB /分钟的写入速度是不完全荒谬的。 对不起 – 这是物理学!
为什么不使用BackgroundWorker
类来实现这一点,因为您可以将任何内容传递给ReportProgress
方法来指示状态报告。 看下面的例子:
私人BackgroundWorker bgWorker; public Form1() { 的InitializeComponent(); bgWorker = new BackgroundWorker(); bgWorker.DoWork + = new DoWorkEventHandler(bgWorker_DoWork); bgWorker.ProgressChanged + = new ProgressChangedEventHandler(bgWorker_ProgressChanged); bgWorker.RunWorkerCompleted + = new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted); bgWorker.RunWorkerAsync(); } void bgWorker_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) { this.label2.Text =“完成”; } void bgWorker_ProgressChanged(对象发件人,ProgressChangedEventArgs e) { MyStatus myProgressStatus =(MyStatus)e.UserState; this.label2.Text = string.Format(“segments write:{0}”+ Environment.Newline +“Segments Remain:{1}”,myProgressStatus.iWritten,myProgressStatus.iRemaining); } void bgWorker_DoWork(对象发件人,DoWorkEventArgs e) { 长FSS = din.TotalFreeSpace; 长段= FSS / 10000; long last_seg = FSS%10000; BinaryWriter br = new BinaryWriter(fs); for(long 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(); } 公共类MyStatus { public int iWritten; public int iRemaining; public MyStatus(int iWrit,int iRem){ this.iWritten = iWrit; this.iRemaining = iRem; } } }
这是一个粗略的草案…希望这有助于,最好的问候,汤姆。
我可能是错的,但是你可能会发现,创build一个很大的文件是不可能的,因为在I / O写入过程中会有一个瓶颈。
但是在上面的代码中,Applciation.DoEvents会降低速度。 另外,重绘screenthis.label2.Text =会稍微减慢速度。