Tôi có một nhiệm vụ đáng yêu là tìm ra cách xử lý các tệp lớn đang được tải vào trình chỉnh sửa tập lệnh của ứng dụng của chúng tôi (nó giống như VBA cho sản phẩm nội bộ của chúng tôi cho các macro nhanh). Hầu hết các tệp có dung lượng khoảng 300-400 KB tải tốt. Nhưng khi chúng vượt quá 100 MB, quá trình này sẽ gặp khó khăn (như bạn mong đợi).
Điều xảy ra là tệp được đọc và chuyển vào RichTextBox, sau đó được điều hướng - đừng lo lắng quá nhiều về phần này.
Nhà phát triển đã viết mã ban đầu chỉ đơn giản là sử dụng StreamReader và làm
[Reader].ReadToEnd()
có thể mất khá nhiều thời gian để hoàn thành.
Nhiệm vụ của tôi là chia nhỏ đoạn mã này, đọc nó thành từng đoạn vào bộ đệm và hiển thị thanh tiến trình với tùy chọn hủy nó.
Một số giả định:
- Hầu hết các tệp sẽ có dung lượng 30-40 MB
- Nội dung của tệp là văn bản (không phải nhị phân), một số là định dạng Unix, một số là DOS.
- Sau khi nội dung được truy xuất, chúng tôi sẽ tìm ra dấu chấm hết được sử dụng.
- Không ai lo lắng khi nó được tải, thời gian cần thiết để hiển thị trong richtextbox. Nó chỉ là tải ban đầu của văn bản.
Bây giờ cho các câu hỏi:
- Tôi có thể chỉ cần sử dụng StreamReader, sau đó kiểm tra thuộc tính Độ dài (vì vậy ProgressMax) và đưa ra lệnh Đọc cho một kích thước bộ đệm đã đặt và lặp lại trong vòng lặp trong khi WHILST bên trong trình làm việc nền, vì vậy nó không chặn luồng giao diện người dùng chính? Sau đó, trả lại trình xây dựng chuỗi về chuỗi chính sau khi hoàn thành.
- Nội dung sẽ được chuyển đến một StringBuilder. tôi có thể khởi tạo StringBuilder với kích thước của luồng nếu độ dài có sẵn không?
Đây có phải là những ý tưởng tốt (theo ý kiến chuyên môn của bạn) không? Trước đây, tôi đã gặp một số vấn đề khi đọc nội dung từ Luồng, vì nó sẽ luôn bỏ sót vài byte cuối cùng hoặc thứ gì đó, nhưng tôi sẽ hỏi một câu hỏi khác nếu trường hợp này xảy ra.