Як створити рядок певної довжини, який потрібно вставити у файл, щоб відповідати критеріям розміру файлу?


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)) {

     }
}

1
Для чого потрібно створити рядок? Просто напишіть свій буфер.
Лазар

Скажімо, я хочу розширити його для створення текстових файлів Lorem Ipsum, а не просто "fs.Write (буфер, 0, (int) fileSizeInKB)".
VajNyiaj

Відповіді:


347

Ви завжди можете використовувати конструктор для рядка, який займає a char повторно та кілька разів, коли цей символ повторюється:

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

Це дає вам струну з 5000 зірок - підганяйте до своїх потреб.


83
+1 Що робили наші предки до переповнення стека? Така проста, така мила.
Dan Solovay

6
Переповнення стека - це буквально десятка найкращих технологічних досягнень усіх часів: - Як же, до біса, хтось навчився ефективно кодувати без нього, ми ніколи не дізнаємось
Бен Акін

2
Я був там, в ці давні часи, і я ще не відчуваю себе предком: D Єдиний спосіб знайти такі перлини - це пошук вашого коду та / або коду вашої команди та накопичення хороших речей з часом. Тепер ми можемо поділитися перлами з усіма :)
Анджей Мартина

13

Найпростішим способом було б наступний код:

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

Тепер у вас є рядок з такою кількістю А, скільки потрібно.

Щоб заповнити його 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 символів. Але врахуйте, що файл може мати додаткові заголовки / метадані, тому вам може знадобитися врахувати це та зменшити кількість символів для запису у файл.


0

Як частковий варіант відповіді на ваше запитання, я нещодавно створив портативний додаток WPF, який легко створює файли "мотлоху" майже будь-якого розміру: https://github.com/webmooch/FileCreator

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.