Как сгенерировать строку определенной длины для вставки в файл в соответствии с критериями размера файла?

114

У меня есть требование проверить некоторые проблемы с нагрузкой в ​​отношении размера файла. У меня есть приложение для Windows, написанное на C #, которое автоматически генерирует файлы. Я знаю размер каждого файла, например. 100КБ и сколько файлов нужно сгенерировать. Мне нужна помощь, как сгенерировать строку, меньшую или равную требуемому размеру файла.

псевдокод:

long fileSizeInKB = (1024 * 100); //100KB
int numberOfFiles = 5;

for(var i = 0; i < numberOfFiles - 1; i++) {
     var dataSize = fileSizeInKB;
     var buffer = new byte[dataSize];
     using (var fs = new FileStream(File, FileMode.Create, FileAccess.Write)) {

     }
}
VajNyiaj
источник
1
Зачем нужно создавать строку? Просто напишите свой буфер.
Lazarus
Скажем, я хочу расширить его для создания текстовых файлов Lorem Ipsum, а не просто «fs.Write (buffer, 0, (int) fileSizeInKB)».
VajNyiaj

Ответы:

347

Вы всегда можете использовать конструктор a для строки, которая принимает a charи сколько раз вы хотите, чтобы этот символ повторялся:

string myString = new string('*', 5000);

Это дает вам строку из 5000 звезд - настройте в соответствии с вашими потребностями.

marc_s
источник
83
+1 Чем занимались наши предки до Stack Overflow? Так просто, так мило.
Дэн Соловей
6
Stack overflow - это буквально десять лучших технологических достижений всех времен: -D, как, черт возьми, кто-то научился эффективно кодировать без него, мы никогда не узнаем,
Бен Акин
2
Я был там, в те древние времена, и я еще не чувствую себя предком: D Единственный способ найти такие жемчужины - это поискать в вашем коде и / или коде вашей команды и со временем накопить хорошие вещи. Теперь мы можем поделиться жемчугом со всеми :)
Анджей Мартина
13

Самый простой способ - это следующий код:

var content = new string('A', fileSizeInKB);

Теперь у вас есть строка с таким количеством A, которое требуется.

Чтобы заполнить его Lorem Ipsum или другой повторяющейся строкой, создайте что-то вроде следующего псевдокода:

string contentString = "Lorem Ipsum...";
for (int i = 0; i < fileSizeInKB / contentString.Length; i++)
  //write contentString to file

if (fileSizeInKB % contentString.Length > 0)
  // write remaining substring of contentString to file

Изменить: если вы сохраняете в Unicode, вам может потребоваться половина количества файлов, потому что Unicode использует два байта на символ, если я правильно помню.

Флориан фон Спичак
источник
4
fileSizeInKB должен быть fileSizeInBytes .. или fileSizeInBytes / 2, если вы выводите Unicode?
Джеймс Гонт
1
Да, я использовал имя переменной образца, присвоенное значение - байты, поэтому либо имя неверно, либо присвоенное значение.
Флориан фон Спичак
2

Есть очень много вариантов того, как это можно сделать. Можно было бы заполнить файл кучей символов. Вам нужно 100КБ? Нет проблем .. 100 * 1024 * 8 = 819200 бит. Один символ - это 16 бит. 819200/16 = 51200. Вам нужно вставить 51 200 символов в файл. Но учтите, что файл может иметь дополнительный заголовок / метаданные, поэтому вам может потребоваться учесть это и уменьшить количество символов для записи в файл.

Kon
источник
0

В качестве частичного ответа на ваш вопрос я недавно создал портативное приложение WPF, которое легко создает «ненужные» файлы практически любого размера: https://github.com/webmooch/FileCreator

Bosco
источник