Como gerar string de determinado comprimento para inserir em um arquivo para atender a um critério de tamanho de arquivo?

114

Tenho um requisito para testar alguns problemas de carga em relação ao tamanho do arquivo. Eu tenho um aplicativo do Windows escrito em C # que irá gerar os arquivos automaticamente. Eu sei o tamanho de cada arquivo, ex. 100 KB e quantos arquivos gerar. Preciso de ajuda é como gerar uma string menor ou igual ao tamanho do arquivo necessário.

pseudo-código:

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
fonte
1
Por que você precisa criar uma string? Basta escrever seu buffer.
Lazarus
Digamos que eu queira estendê-lo para gerar arquivos de texto Lorem Ipsum em vez de apenas "fs.Write (buffer, 0, (int) fileSizeInKB)".
VajNyiaj

Respostas:

347

Você sempre pode usar o construtor a para string que leva ae charvárias vezes para que o caractere seja repetido:

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

Isso lhe dá uma seqüência de 5.000 estrelas - ajuste de acordo com suas necessidades.

marc_s
fonte
83
+1 O que nossos ancestrais faziam antes do Stack Overflow? Tão simples, tão doce.
Dan Solovay
6
Stack overflow é literalmente as dez maiores conquistas tecnológicas de todos os tempos :-D como diabos alguém aprendeu a codificar com eficiência sem ele, nunca saberemos
Ben Akin
2
Eu estive lá, nestes tempos antigos e ainda não me sinto um ancestral: D A única forma de encontrar essas pérolas era pesquisar através do seu código e / ou código da sua equipe e acumular coisas boas ao longo do tempo. Agora podemos compartilhar pérolas com todos :)
Andrzej Martyna
13

A maneira mais fácil seria seguir o código:

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

Agora você tem uma string com tantos A quantos forem necessários.

Para preenchê-lo com Lorem Ipsum ou alguma outra string repetida, construa algo como o seguinte pseudocódigo:

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

Editar: Se você estiver salvando em Unicode, pode ser necessário reduzir a metade da contagem do tamanho do arquivo porque o Unicode usa dois bytes por caractere, se bem me lembro.

Florian von Spiczak
fonte
4
fileSizeInKB deve ser fileSizeInBytes .. ou fileSizeInBytes / 2 se você estiver enviando Unicode?
James Gaunt
1
Sim, usei o nome da variável da amostra, o valor atribuído é bytes, então ou o nome está errado ou o valor atribuído.
Florian von Spiczak de
2

Existem tantas variações sobre como você pode fazer isso. Uma delas seria preencher o arquivo com um monte de caracteres. Você precisa de 100 KB? Sem problemas .. 100 * 1024 * 8 = 819200 bits. Um único caractere tem 16 bits. 819200/16 = 51200. Você precisa colocar 51.200 caracteres em um arquivo. Mas considere que um arquivo pode ter cabeçalho / metadados adicionais, então você pode precisar considerar isso e diminuir o número de caracteres a serem gravados no arquivo.

Kon
fonte
0

Como uma resposta parcial à sua pergunta, recentemente criei um aplicativo WPF portátil que cria facilmente arquivos 'lixo' de quase qualquer tamanho: https://github.com/webmooch/FileCreator

Bosco
fonte