Comment générer une chaîne d'une certaine longueur à insérer dans un fichier pour répondre à un critère de taille de fichier?

114

J'ai besoin de tester certains problèmes de charge en ce qui concerne la taille du fichier. J'ai une application Windows écrite en C # qui générera automatiquement les fichiers. Je connais la taille de chaque fichier, ex. 100 Ko et le nombre de fichiers à générer. Ce dont j'ai besoin d'aide, c'est comment générer une chaîne inférieure ou égale à la taille de fichier requise.

pseudo code:

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
la source
1
Pourquoi avez-vous besoin de créer une chaîne? Écrivez simplement votre tampon.
Lazarus
Disons que je veux l'étendre pour générer des fichiers texte Lorem Ipsum plutôt que simplement "fs.Write (buffer, 0, (int) fileSizeInKB)".
VajNyiaj

Réponses:

346

Vous pouvez toujours utiliser le constructeur a pour une chaîne qui prend un charet un certain nombre de fois que vous voulez que ce caractère soit répété:

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

Cela vous donne une chaîne de 5000 étoiles - ajustez vos besoins.

marc_s
la source
83
+1 Qu'ont fait nos ancêtres avant le débordement de pile? Si simple, si doux.
Dan Solovay du
6
Le débordement de pile est littéralement le top dix des réalisations technologiques de tous les temps: - D comment diable quelqu'un a appris à coder efficacement sans lui, nous ne le saurons jamais
Ben Akin
2
J'étais là, dans ces temps anciens et je ne me sens pas encore comme un ancêtre: D La seule façon de trouver de telles perles était de chercher dans votre code et / ou le code de votre équipe et d'accumuler de bonnes choses au fil du temps. Maintenant, nous pouvons partager des perles avec tout le monde :)
Andrzej Martyna
13

Le moyen le plus simple serait de suivre le code:

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

Vous avez maintenant une chaîne avec autant de A que nécessaire.

Pour le remplir avec Lorem Ipsum ou une autre chaîne répétitive, construisez quelque chose comme le pseudocode suivant:

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

Edit: Si vous enregistrez en Unicode, vous devrez peut-être réduire de moitié le nombre de taille de fichier car Unicode utilise deux octets par caractère si je me souviens bien.

Florian von Spiczak
la source
4
fileSizeInKB doit être fileSizeInBytes .. ou fileSizeInBytes / 2 si vous sortez unicode?
James Gaunt
1
Oui, j'ai utilisé le nom de variable de l'échantillon, la valeur assignée est octets donc soit le nom est faux, soit la valeur assignée.
Florian von Spiczak
2

Il y a tellement de variations sur la façon dont vous pouvez faire cela. La première serait de remplir le fichier avec un tas de caractères. Vous avez besoin de 100 Ko? Pas de problème .. 100 * 1024 * 8 = 819200 bits. Un seul caractère est de 16 bits. 819200/16 = 51200. Vous devez insérer 51 200 caractères dans un fichier. Mais considérez qu'un fichier peut avoir des en-têtes / métadonnées supplémentaires, vous devrez donc peut-être en tenir compte et réduire le nombre de caractères à écrire dans le fichier.

Kon
la source
0

En réponse partielle à votre question, j'ai récemment créé une application WPF portable qui crée facilement des fichiers `` indésirables '' de presque toutes les tailles: https://github.com/webmooch/FileCreator

Bosco
la source