在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 =会稍微减慢速度。