Создание огромного фиктивного файла за несколько секунд в C#

Да. Главные версии добавляют большие, новые опции, могут повредить совместимость или иметь существенно отличающиеся зависимости, и т.д.

, Незначительные выпуски также добавляют опции, но они меньше, иногда упрощенные портированные версии от бета главной версии.

, Если существует третий компонент номера версии, это обычно для важного bugfixes и исправлений безопасности. Если существует больше, это действительно зависит так от продукта, что трудно дать общий ответ.

38
задан Abel 10 December 2009 в 13:50
поделиться

5 ответов

Просто создайте файл, найдите достаточно большое смещение и запишите один байт:

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

В результате получится файл размером 2 ГБ с в основном непредсказуемым содержимым, что должно быть подходящим для ваших целей.

80
ответ дан 27 November 2019 в 02:59
поделиться

Почему вы не использовали класс BackgroundWorker для достижения этой цели, поскольку вы можете передать что угодно в метод ReportProgress , чтобы указать отчет о состоянии. См. Пример ниже:

        private 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 = "Done";
        }

        void bgWorker_ProgressChanged(object sender, 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(object sender, DoWorkEventArgs e)
        {
            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]);
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;
   }
}
}

Это черновик ...

2
ответ дан 27 November 2019 в 02:59
поделиться

Если вас не волнует содержимое, то самый быстрый способ, который я знаю, - это практически мгновенно:

private void CreateDummyFile(string fileName, long length)
{
    using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        fileStream.SetLength(length);
    }
}
71
ответ дан 27 November 2019 в 02:59
поделиться

Если вам нужен только FileStream , вы можете использовать FileStream.SetLength . Это даст вам поток длиной 2 ГБ. Затем вы можете записать последний байт в произвольную позицию по вашему выбору. Но содержимое будет неопределенным.

Если вы действительно пытаетесь создать файл на диске, да, вам нужно будет записать его содержимое. И да, жесткие диски будут медленными; что-то вроде скорости записи 1 ГБ / мин не совсем смешно. Извините, это физика!

4
ответ дан 27 November 2019 в 02:59
поделиться

Я могу ошибаться, но вы, вероятно, обнаружите, что невозможно создать файл такого размера так быстро, поскольку в процессе записи ввода-вывода возникнет узкое место.

Однако в вашем код над Applciation.DoEvents будет замедлять работу. Также любая перерисовка screenthis.label2.Text = вызовет небольшое замедление.

0
ответ дан 27 November 2019 в 02:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: