Eu tenho a adorável tarefa de descobrir como lidar com arquivos grandes sendo carregados no editor de script de nosso aplicativo (é como o VBA para nosso produto interno para macros rápidas). A maioria dos arquivos tem cerca de 300-400 KB, o que é um bom carregamento. Mas, quando ultrapassam 100 MB, o processo passa por momentos difíceis (como seria de esperar).
O que acontece é que o arquivo é lido e colocado em um RichTextBox que é navegado - não se preocupe muito com esta parte.
O desenvolvedor que escreveu o código inicial está simplesmente usando um StreamReader e fazendo
[Reader].ReadToEnd()
que pode demorar um pouco para ser concluído.
Minha tarefa é dividir esse trecho de código, lê-lo em partes em um buffer e mostrar uma barra de progresso com uma opção para cancelá-lo.
Algumas suposições:
- A maioria dos arquivos terá 30-40 MB
- O conteúdo do arquivo é texto (não binário), alguns em formato Unix, outros em DOS.
- Depois que o conteúdo é recuperado, descobrimos qual terminador é usado.
- Ninguém se preocupa depois que ele é carregado, o tempo que leva para renderizar na caixa de texto rico. É apenas o carregamento inicial do texto.
Agora, para as perguntas:
- Posso simplesmente usar StreamReader, verificar a propriedade Length (portanto, ProgressMax) e emitir um Read para um tamanho de buffer definido e iterar em um loop while WHILST dentro de um trabalhador de segundo plano, de modo que não bloqueie o thread de IU principal? Em seguida, retorne o stringbuilder para o thread principal quando estiver concluído.
- O conteúdo irá para um StringBuilder. posso inicializar o StringBuilder com o tamanho do fluxo se o comprimento estiver disponível?
Estas são (na sua opinião profissional) boas ideias? Eu tive alguns problemas no passado com a leitura de conteúdo do Streams, porque sempre perderá os últimos bytes ou algo assim, mas farei outra pergunta se for o caso.