Uygulamamızın komut dosyası düzenleyicisine yüklenen büyük dosyaların nasıl işleneceğini bulmak gibi güzel bir görevim var ( hızlı makrolar için dahili ürünümüz için VBA gibi ). Çoğu dosya yaklaşık 300-400 KB boyutundadır ve bu iyi bir yükleme anlamına gelir. Ancak 100 MB'ın üzerine çıktıklarında süreç zor anlar yaşar (beklediğiniz gibi).
Olan şey, dosyanın okunması ve daha sonra gezinilecek olan bir RichTextBox'a taşınmasıdır - bu bölüm için çok fazla endişelenmeyin.
İlk kodu yazan geliştirici sadece bir StreamReader kullanıyor ve
[Reader].ReadToEnd()
tamamlanması biraz zaman alabilir.
Benim görevim, bu kod parçasını parçalamak, parçalar halinde bir arabelleğe okumak ve iptal etme seçeneği olan bir ilerleme çubuğu göstermektir.
Bazı varsayımlar:
- Çoğu dosya 30-40 MB olacaktır
- Dosyanın içeriği metindir (ikili değil), bazıları Unix formatı, bazıları DOS.
- İçerikler alındıktan sonra, hangi sonlandırıcının kullanıldığını hesaplıyoruz.
- Hiç kimse bir kez yüklendiğinde zengin metin kutusunda işlemek için gereken süreyi düşünmez. Bu sadece metnin ilk yüklemesi.
Şimdi sorular için:
- StreamReader'ı basitçe kullanabilir miyim, sonra Length özelliğini (yani ProgressMax) kontrol edebilir ve bir set arabellek boyutu için Read yayınlayabilir ve bir while döngüsü içinde WHILST içinde yineleme yapabilir miyim , böylece ana UI iş parçacığını engellemesin? Ardından, tamamlandığında dizgi oluşturucuyu ana iş parçacığına döndürün.
- İçerik bir StringBuilder'a gidecek. Uzunluk mevcutsa StringBuilder'ı akışın boyutuyla başlatabilir miyim?
Bunlar (profesyonel görüşlerinize göre) iyi fikirler mi? Geçmişte Akışlardan içerik okumakla ilgili birkaç sorun yaşadım çünkü her zaman son birkaç baytı veya başka bir şeyi kaçıracak, ancak durum buysa başka bir soru soracağım.