Tengo la hermosa tarea de averiguar cómo manejar archivos grandes que se cargan en el editor de scripts de nuestra aplicación (es como VBA para nuestro producto interno para macros rápidas). La mayoría de los archivos pesan alrededor de 300-400 KB, lo cual es una carga adecuada. Pero cuando superan los 100 MB, el proceso tiene dificultades (como era de esperar).
Lo que sucede es que el archivo se lee y se inserta en un RichTextBox que luego se navega; no se preocupe demasiado por esta parte.
El desarrollador que escribió el código inicial simplemente usa un StreamReader y hace
[Reader].ReadToEnd()
que podría tardar bastante en completarse.
Mi tarea es dividir este fragmento de código, leerlo en trozos en un búfer y mostrar una barra de progreso con una opción para cancelarlo.
Algunas suposiciones:
- La mayoría de los archivos serán de 30 a 40 MB
- El contenido del archivo es texto (no binario), algunos son formato Unix, algunos son DOS.
- Una vez que se recupera el contenido, calculamos qué terminador se utiliza.
- A nadie le preocupa una vez que se ha cargado, el tiempo que se tarda en renderizar en el cuadro de texto enriquecido. Es solo la carga inicial del texto.
Ahora para las preguntas:
- ¿Puedo simplemente usar StreamReader, luego verificar la propiedad Length (es decir, ProgressMax) y emitir una lectura para un tamaño de búfer establecido e iterar en un ciclo while MIENTRAS dentro de un trabajador en segundo plano, para que no bloquee el hilo principal de la interfaz de usuario? Luego, regrese el generador de cadenas al hilo principal una vez que esté completo.
- Los contenidos irán a un StringBuilder. ¿Puedo inicializar StringBuilder con el tamaño de la secuencia si la longitud está disponible?
¿Son estas (en su opinión profesional) buenas ideas? He tenido algunos problemas en el pasado con la lectura de contenido de Streams, porque siempre se perderán los últimos bytes o algo así, pero haré otra pregunta si este es el caso.