Wie kann eine Zeichenfolge mit einer bestimmten Länge generiert werden, die in eine Datei eingefügt werden soll, um die Kriterien für die Dateigröße zu erfüllen?

114

Ich muss einige Ladeprobleme in Bezug auf die Dateigröße testen. Ich habe eine Windows-Anwendung in C # geschrieben, die die Dateien automatisch generiert. Ich kenne die Größe jeder Datei, z. 100 KB und wie viele Dateien generiert werden sollen. Ich brauche Hilfe beim Generieren einer Zeichenfolge, die kleiner oder gleich der erforderlichen Dateigröße ist.

Pseudocode:

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
quelle
1
Warum müssen Sie eine Zeichenfolge erstellen? Schreiben Sie einfach Ihren Puffer.
Lazarus
Angenommen, ich möchte es erweitern, um Lorem Ipsum-Textdateien zu generieren, anstatt nur "fs.Write (buffer, 0, (int) fileSizeInKB)".
VajNyiaj

Antworten:

344

Sie können immer den Konstruktor a für einen String verwenden, der ein charund mehrere Male dauert, bis das Zeichen wiederholt wird:

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

Dies gibt Ihnen eine Reihe von 5000 Sternen - optimieren Sie Ihre Bedürfnisse.

marc_s
quelle
83
+1 Was haben unsere Vorfahren vor dem Stapelüberlauf getan? So einfach, so süß.
Dan Solovay
6
Der Stapelüberlauf ist buchstäblich die Top Ten der technologischen Errungenschaften aller Zeiten: - Wie zum Teufel jemand gelernt hat, ohne ihn effizient zu programmieren, werden wir nie erfahren
Ben Akin
2
Ich war in diesen alten Zeiten dort und fühle mich noch nicht als Vorfahr: D Der einzige Weg, solche Perlen zu finden, bestand darin, Ihren Code und / oder den Code Ihres Teams zu durchsuchen und im Laufe der Zeit gute Dinge anzusammeln. Jetzt können wir Perlen mit allen teilen :)
Andrzej Martyna
13

Der einfachste Weg wäre der folgende Code:

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

Jetzt haben Sie eine Zeichenfolge mit so vielen A wie erforderlich.

Um es mit Lorem Ipsum oder einem anderen sich wiederholenden String zu füllen, erstellen Sie so etwas wie den folgenden Pseudocode:

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

Bearbeiten: Wenn Sie in Unicode speichern, müssen Sie möglicherweise die Hälfte der Dateigröße zählen, da Unicode zwei Bytes pro Zeichen verwendet, wenn ich mich richtig erinnere.

Florian von Spiczak
quelle
4
fileSizeInKB sollte fileSizeInBytes .. oder fileSizeInBytes / 2 sein, wenn Sie Unicode ausgeben?
James Gaunt
1
Ja, ich habe den Variablennamen des Beispiels verwendet. Der zugewiesene Wert ist Byte, daher ist entweder der Name falsch oder der zugewiesene Wert.
Florian von Spiczak
2

Es gibt so viele Variationen, wie Sie dies tun können. Eine wäre, die Datei mit ein paar Zeichen zu füllen. Sie benötigen 100 KB? Kein Problem. 100 * 1024 * 8 = 819200 Bit. Ein einzelnes Zeichen besteht aus 16 Bit. 819200/16 = 51200. Sie müssen 51.200 Zeichen in eine Datei einfügen. Beachten Sie jedoch, dass eine Datei möglicherweise zusätzliche Header- / Metadaten enthält. Daher müssen Sie dies möglicherweise berücksichtigen und die Anzahl der Zeichen verringern, die in die Datei geschrieben werden sollen.

Kon
quelle
0

Als Teilantwort auf Ihre Frage habe ich kürzlich eine tragbare WPF-App erstellt, mit der Sie problemlos Junk-Dateien fast jeder Größe erstellen können: https://github.com/webmooch/FileCreator

Bosco
quelle