Mam cudowne zadanie, jak radzić sobie z dużymi plikami ładowanymi do edytora skryptów naszej aplikacji (to jest jak VBA dla naszego wewnętrznego produktu do szybkich makr). Większość plików ma około 300-400 KB, co jest dobrym ładowaniem. Ale kiedy przekraczają 100 MB, proces jest trudny (jak można się spodziewać).
Dzieje się tak, że plik jest odczytywany i umieszczany w RichTextBox, po którym jest nawigowany - nie przejmuj się zbytnio tą częścią.
Deweloper, który napisał początkowy kod, po prostu używa StreamReader i robi
[Reader].ReadToEnd()
co może zająć trochę czasu.
Moim zadaniem jest rozbicie tego fragmentu kodu, odczytanie go fragmentami do bufora i wyświetlenie paska postępu z opcją anulowania.
Niektóre założenia:
- Większość plików ma rozmiar 30-40 MB
- Zawartość pliku jest tekstowa (nie binarna), niektóre są w formacie uniksowym, a niektóre w systemie DOS.
- Po pobraniu zawartości ustalamy, jaki terminator jest używany.
- Nikt nie przejmuje się po załadowaniu czasu potrzebnego na renderowanie w bogatym polu tekstowym. To tylko wstępne ładowanie tekstu.
A teraz pytania:
- Czy mogę po prostu użyć StreamReader, a następnie sprawdzić właściwość Length (czyli ProgressMax) i wydać Read dla ustawionego rozmiaru buforu i wykonać iterację w pętli while WHILST wewnątrz procesu roboczego w tle, aby nie blokował głównego wątku interfejsu użytkownika? Następnie po zakończeniu zwróć program budujący ciąg do głównego wątku.
- Zawartość trafi do StringBuilder. czy mogę zainicjować StringBuilder z rozmiarem strumienia, jeśli długość jest dostępna?
Czy są to (Twoim zdaniem) dobre pomysły? W przeszłości miałem kilka problemów z czytaniem treści ze strumieni, ponieważ zawsze pomija ostatnie kilka bajtów lub coś w tym stylu, ale zadam inne pytanie, jeśli tak jest.