Ho il bel compito di capire come gestire file di grandi dimensioni caricati nell'editor di script della nostra applicazione (è come VBA per il nostro prodotto interno per macro rapide). La maggior parte dei file ha una dimensione di circa 300-400 KB, il caricamento va bene. Ma quando superano i 100 MB il processo ha difficoltà (come ci si aspetterebbe).
Quello che succede è che il file viene letto e inserito in un RichTextBox che viene quindi esplorato - non preoccuparti troppo di questa parte.
Lo sviluppatore che ha scritto il codice iniziale sta semplicemente usando un StreamReader e sta facendo
[Reader].ReadToEnd()
che potrebbe richiedere un po 'di tempo per essere completato.
Il mio compito è spezzare questo bit di codice, leggerlo in blocchi in un buffer e mostrare una barra di avanzamento con un'opzione per annullarlo.
Alcuni presupposti:
- La maggior parte dei file sarà di 30-40 MB
- Il contenuto del file è testo (non binario), alcuni sono in formato Unix, altri DOS.
- Una volta recuperato il contenuto, determiniamo quale terminatore viene utilizzato.
- Nessuno si preoccupa una volta caricato il tempo necessario per il rendering nella casella di testo RTF. È solo il caricamento iniziale del testo.
Ora per le domande:
- Posso semplicemente usare StreamReader, quindi controllare la proprietà Length (quindi ProgressMax) ed emettere una lettura per una dimensione del buffer impostata e scorrere in un ciclo while WHILST all'interno di un worker in background, in modo che non blocchi il thread dell'interfaccia utente principale? Quindi restituisci lo stringbuilder al thread principale una volta completato.
- Il contenuto andrà a uno StringBuilder. posso inizializzare lo StringBuilder con la dimensione del flusso se la lunghezza è disponibile?
Queste (secondo le tue opinioni professionali) sono buone idee? Ho avuto alcuni problemi in passato con la lettura di contenuti da Streams, perché mancheranno sempre gli ultimi byte o qualcosa del genere, ma farò un'altra domanda se questo è il caso.