У мене прекрасне завдання - розробити, як обробляти великі файли, що завантажуються в редактор сценаріїв нашої програми (це як VBA для нашого внутрішнього продукту для швидких макросів). Більшість файлів складає близько 300-400 КБ, що є прекрасним завантаженням. Але коли вони перевищують 100 МБ, процес має важкі часи (як і слід було очікувати).
Що трапляється, так це те, що файл читається і переноситься в RichTextBox, який потім здійснюється в навігації - не турбуйтеся надто про цю частину.
Розробник, який написав початковий код, просто використовує StreamReader і робить це
[Reader].ReadToEnd()
що може зайняти досить тривалий час.
Моє завдання - розбити цей біт коду, прочитати його шматками в буфер і показати індикатор виконання з можливістю скасувати його.
Деякі припущення:
- Більшість файлів становитимуть 30-40 МБ
- Вміст файлу - текстовий (не двійковий), деякі мають формат Unix, інші - DOS.
- Після отримання вмісту ми з’ясовуємо, який термінатор використовується.
- Нікого це не турбує, як тільки завантажується час, необхідний для візуалізації в текстовому полі. Це лише початкове завантаження тексту.
Тепер щодо питань:
- Чи можу я просто використати StreamReader, а потім перевірити властивість Length (так ProgressMax) і видати Read для встановленого розміру буфера і перебирати за деякий час цикл WHILST всередині фонового працівника, щоб він не блокував основний потік UI? Потім поверніть конструктор рядків до основного потоку після його завершення.
- Вміст буде спрямовано до StringBuilder. чи можу я ініціалізувати StringBuilder розміром потоку, якщо довжина доступна?
Це (на вашу думку професіонали) хороші ідеї? Раніше у мене було кілька проблем із читанням вмісту з Streams, оскільки він завжди буде пропускати останні кілька байтів або щось інше, але я поставлю інше питання, якщо це так.