¿Cómo generar una cadena de cierta longitud para insertar en un archivo para cumplir con un criterio de tamaño de archivo?

114

Tengo el requisito de probar algunos problemas de carga con respecto al tamaño del archivo. Tengo una aplicación de Windows escrita en C # que generará automáticamente los archivos. Sé el tamaño de cada archivo, ej. 100 KB y cuántos archivos generar. Lo que necesito ayuda es cómo generar una cadena menor o igual al tamaño de archivo requerido.

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
fuente
1
¿Por qué necesitas crear una cadena? Solo escribe tu búfer.
Lázaro
Digamos que quiero extenderlo para generar archivos de texto de Lorem Ipsum en lugar de simplemente "fs.Write (buffer, 0, (int) fileSizeInKB)".
VajNyiaj

Respuestas:

346

Siempre puede usar el constructor a para una cadena que toma a chary varias veces que desea que ese carácter se repita:

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

Esto le da una cadena de 5000 estrellas, ajústelo a sus necesidades.

marc_s
fuente
83
+1 ¿Qué hacían nuestros antepasados ​​antes de Stack Overflow? Tan simple, tan dulce.
Dan Solovay
6
El desbordamiento de pila es literalmente los diez principales logros tecnológicos de todos los tiempos :-D cómo diablos alguien aprendió a codificar de manera eficiente sin él, nunca lo sabremos
Ben Akin
2
Estuve allí, en estos tiempos antiguos y todavía no me siento como un antepasado: D La única forma de encontrar esas perlas era buscar en tu código y / o código de tu equipo y acumular cosas buenas a lo largo del tiempo. Ahora podemos compartir perlas con todos :)
Andrzej Martyna
13

La forma más fácil sería seguir el código:

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

Ahora tienes una cuerda con tantas A como sea necesario.

Para llenarlo con Lorem Ipsum o alguna otra cadena repetida, construya algo como el siguiente 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: Si está guardando en Unicode, es posible que necesite la mitad del recuento porque Unicode usa dos bytes por carácter si no recuerdo mal.

Florian von Spiczak
fuente
4
fileSizeInKB debería ser fileSizeInBytes .. o fileSizeInBytes / 2 si está generando unicode?
James Gaunt
1
Sí, utilicé el nombre de la variable de la muestra, el valor asignado son bytes, por lo que el nombre es incorrecto o el valor asignado.
Florian von Spiczak
2

Hay tantas variaciones sobre cómo puede hacer esto. Una sería, llenar el archivo con un montón de caracteres. ¿Necesitas 100 KB? No hay problema ... 100 * 1024 * 8 = 819200 bits. Un solo carácter tiene 16 bits. 819200/16 = 51200. Necesita pegar 51.200 caracteres en un archivo. Pero tenga en cuenta que un archivo puede tener encabezados / metadatos adicionales, por lo que es posible que deba tener en cuenta eso y disminuir la cantidad de caracteres para escribir en el archivo.

Kon
fuente