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

问题描述 投票:0回答:6

我想在几秒钟内创建一个巨大的虚拟文件,比如 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 分钟或更多分钟。还有其他更快的方法吗?

c# file-io
6个回答
93
投票

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

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

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


80
投票

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

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

4
投票

如果您只需要

FileStream
,则可以使用
FileStream.SetLength
。这将为您提供 2 GB 长的流。然后您可以在您选择的任意位置写入最终字节。但内容将是未定义的。

如果您尝试在磁盘上实际创建文件,是的,您需要实际写入其内容。是的,硬盘会变慢;像 1 GB/分钟这样的写入速度并不是完全荒谬的。抱歉——这就是物理学!


2
投票

为什么不使用

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;
   }
}
}

这是一个草稿...


0
投票

我可能是错的,但你可能会发现不可能那么快地创建这么大的文件,因为 I/O 写入过程中会出现瓶颈。

但是,在上面的代码中,Applciation.DoEvents 会减慢速度。此外,对 screenthis.label2.Text = 的任何重新绘制都会导致速度稍微减慢。


0
投票

创建一个 1 GiB 文件。

string testfile = "hello";
var content = new byte[1024L * 1024 * 1024];
Random random = new Random();

random.NextBytes(content);
File.WriteAllBytes(testfile, content);
© www.soinside.com 2019 - 2024. All rights reserved.