ฉันมีงานที่น่ารักในการหาวิธีจัดการไฟล์ขนาดใหญ่ที่โหลดลงในโปรแกรมแก้ไขสคริปต์ของแอปพลิเคชันของเรา (เหมือนกับVBAสำหรับผลิตภัณฑ์ภายในของเราสำหรับมาโครด่วน) ไฟล์ส่วนใหญ่มีขนาดประมาณ 300-400 KB ซึ่งโหลดได้ดี แต่เมื่อพวกเขาไปเกิน 100 MB กระบวนการนี้ก็มีช่วงเวลาที่ยากลำบาก (ตามที่คุณคาดหวัง)
สิ่งที่เกิดขึ้นคือไฟล์ถูกอ่านและถูกส่งไปยัง RichTextBox ซึ่งจะถูกนำทางไป - อย่ากังวลกับส่วนนี้มากเกินไป
นักพัฒนาที่เขียนโค้ดเริ่มต้นเพียงแค่ใช้ StreamReader และทำ
[Reader].ReadToEnd()
ซึ่งอาจใช้เวลาสักพักจึงจะเสร็จสมบูรณ์
งานของฉันคือทำลายโค้ดนี้ออกอ่านเป็นชิ้น ๆ เป็นบัฟเฟอร์และแสดงแถบความคืบหน้าพร้อมตัวเลือกในการยกเลิก
สมมติฐานบางประการ:
- ไฟล์ส่วนใหญ่จะมีขนาด 30-40 MB
- เนื้อหาของไฟล์เป็นข้อความ (ไม่ใช่ไบนารี) บางส่วนเป็นรูปแบบ Unix บางส่วนเป็น DOS
- เมื่อดึงเนื้อหามาแล้วเราจะหาสิ่งที่ใช้เทอร์มิเนเตอร์
- ไม่มีใครกังวลเมื่อโหลดเวลาที่ใช้ในการแสดงผลใน richtextbox มันเป็นเพียงการโหลดข้อความเริ่มต้น
ตอนนี้สำหรับคำถาม:
- ฉันสามารถใช้ StreamReader จากนั้นตรวจสอบคุณสมบัติ Length (ดังนั้น ProgressMax) และออก Read สำหรับขนาดบัฟเฟอร์ที่ตั้งไว้และวนซ้ำในขณะที่วนซ้ำWHILSTภายในโปรแกรมทำงานเบื้องหลังดังนั้นจึงไม่บล็อกเธรด UI หลัก จากนั้นส่ง stringbuilder กลับไปที่เธรดหลักเมื่อเสร็จสิ้น
- เนื้อหาจะไปที่ StringBuilder ฉันสามารถเริ่มต้น StringBuilder ด้วยขนาดของสตรีมได้หรือไม่หากมีความยาว
สิ่งเหล่านี้เป็นความคิดที่ดี (ในความคิดเห็นของคุณ) ที่ผ่านมาฉันเคยมีปัญหาบางอย่างเกี่ยวกับการอ่านเนื้อหาจากสตรีมเพราะมันมักจะพลาดไม่กี่ไบต์สุดท้ายหรือบางอย่าง แต่ฉันจะถามคำถามอื่นหากเป็นเช่นนั้น