Ich habe die schöne Aufgabe, herauszufinden, wie man mit großen Dateien umgeht, die in den Skripteditor unserer Anwendung geladen werden (es ist wie VBA für unser internes Produkt für schnelle Makros). Die meisten Dateien haben eine Größe von 300-400 KB, was ein gutes Laden ist. Aber wenn sie über 100 MB hinausgehen, fällt es dem Prozess schwer (wie zu erwarten).
Was passiert ist, dass die Datei gelesen und in eine RichTextBox verschoben wird, die dann navigiert wird - machen Sie sich nicht zu viele Sorgen um diesen Teil.
Der Entwickler, der den ursprünglichen Code geschrieben hat, verwendet einfach einen StreamReader und tut dies
[Reader].ReadToEnd()
Das könnte eine ganze Weile dauern.
Meine Aufgabe ist es, diesen Code aufzubrechen, ihn in Blöcken in einen Puffer einzulesen und einen Fortschrittsbalken mit der Option zum Abbrechen anzuzeigen.
Einige Annahmen:
- Die meisten Dateien sind 30-40 MB groß
- Der Inhalt der Datei ist Text (nicht binär), einige sind im Unix-Format, einige sind DOS.
- Sobald der Inhalt abgerufen ist, ermitteln wir, welcher Terminator verwendet wird.
- Niemand ist besorgt, sobald es die Zeit geladen hat, die zum Rendern in der Richtextbox benötigt wird. Es ist nur das anfängliche Laden des Textes.
Nun zu den Fragen:
- Kann ich einfach StreamReader verwenden, dann die Length-Eigenschaft (also ProgressMax) überprüfen und einen Lesevorgang für eine festgelegte Puffergröße ausgeben und in einer while-Schleife WHILST in einem Hintergrund-Worker durchlaufen , damit der Haupt-UI-Thread nicht blockiert wird? Kehren Sie dann den Stringbuilder nach Abschluss zum Hauptthread zurück.
- Der Inhalt wird an einen StringBuilder gesendet. Kann ich den StringBuilder mit der Größe des Streams initialisieren, wenn die Länge verfügbar ist?
Sind das (Ihrer Meinung nach) gute Ideen? Ich hatte in der Vergangenheit einige Probleme beim Lesen von Inhalten aus Streams, da immer die letzten Bytes oder ähnliches fehlen, aber ich werde eine andere Frage stellen, wenn dies der Fall ist.