Jak wygenerować ciąg o określonej długości do wstawienia do pliku, aby spełniał kryteria rozmiaru pliku?

114

Mam obowiązek przetestować niektóre problemy z ładowaniem w odniesieniu do rozmiaru pliku. Mam aplikację Windows napisaną w C #, która automatycznie generuje pliki. Znam rozmiar każdego pliku, np. 100 KB i ile plików do wygenerowania. Potrzebuję pomocy w tym, jak wygenerować ciąg mniejszy lub równy wymaganemu rozmiarowi pliku.

pseudo kod:

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
źródło
1
Dlaczego potrzebujesz stworzyć ciąg? Po prostu napisz swój bufor.
Lazarus
Powiedzmy, że chcę go rozszerzyć, aby generował pliki tekstowe Lorem Ipsum, a nie tylko „fs.Write (buffer, 0, (int) fileSizeInKB)”.
VajNyiaj

Odpowiedzi:

347

Zawsze możesz użyć konstruktora a dla ciągu, który przyjmuje charai kilka razy, aby powtórzyć ten znak:

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

Daje ci to ciąg 5000 gwiazdek - dostosuj do swoich potrzeb.

marc_s
źródło
83
+1 Co robili nasi przodkowie przed przepełnieniem stosu? Tak proste, takie słodkie.
Dan Solovay,
6
Przepełnienie stosu to dosłownie dziesięć najlepszych osiągnięć technologicznych wszechczasów :-D jak do diabła ktokolwiek nauczył się wydajnie kodować bez niego, nigdy się nie dowiemy
Ben Akin
2
Byłem tam, w tych starożytnych czasach i jeszcze nie czuję się przodkiem: D Jedynym sposobem na znalezienie takich pereł było przeszukanie kodu i / lub kodu zespołu i gromadzenie dobrych rzeczy w czasie. Teraz możemy podzielić się perłami ze wszystkimi :)
Andrzej Martyna
13

Najłatwiejszym sposobem będzie następujący kod:

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

Teraz masz ciąg zawierający tyle liter A, ile potrzeba.

Aby wypełnić go Lorem Ipsum lub innym powtarzającym się ciągiem, zbuduj coś podobnego do następującego pseudokodu:

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

Edycja: jeśli zapisujesz w Unicode, może być konieczne zmniejszenie o połowę rozmiaru pliku, ponieważ Unicode wykorzystuje dwa bajty na znak, jeśli dobrze pamiętam.

Florian von Spiczak
źródło
4
fileSizeInKB powinno mieć wartość fileSizeInBytes .. lub fileSizeInBytes / 2, jeśli wyprowadzasz Unicode?
James Gaunt
1
Tak, użyłem nazwy zmiennej próbki, przypisana wartość to bajty, więc albo nazwa jest błędna, albo przypisana wartość.
Florian von Spiczak
2

Istnieje wiele odmian tego, jak możesz to zrobić. Jednym z nich byłoby wypełnienie pliku kilkoma znakami. Potrzebujesz 100 KB? Żaden problem. 100 * 1024 * 8 = 819200 bitów. Pojedynczy znak ma 16 bitów. 819200/16 = 51200. Musisz wstawić do pliku 51 200 znaków. Ale weź pod uwagę, że plik może mieć dodatkowe nagłówki / metadane, więc może być konieczne uwzględnienie tego i zmniejszenie liczby znaków do zapisania w pliku.

Kon
źródło
0

Jako częściową odpowiedź na twoje pytanie niedawno stworzyłem przenośną aplikację WPF, która z łatwością tworzy `` niepotrzebne '' pliki prawie dowolnego rozmiaru: https://github.com/webmooch/FileCreator

Bosco
źródło