У меня есть прекрасная задача - решить, как обрабатывать большие файлы, загружаемые в редактор сценариев нашего приложения (это похоже на VBA для нашего внутреннего продукта для быстрых макросов). Большинство файлов имеют размер около 300-400 КБ, что вполне нормально. Но когда они выходят за пределы 100 МБ, процессу трудно (как и следовало ожидать).
Что происходит, так это то, что файл читается и помещается в RichTextBox, который затем перемещается - не беспокойтесь об этой части.
Разработчик, написавший исходный код, просто использует StreamReader и выполняет
[Reader].ReadToEnd()
, что может занять некоторое время.
Моя задача - разбить этот бит кода, прочитать его порциями в буфер и показать индикатор выполнения с возможностью отменить его.
Некоторые предположения:
- Большинство файлов будет 30-40 МБ
- Содержимое файла - текстовое (не двоичное), некоторые в формате Unix, некоторые в DOS.
- Как только содержимое получено, мы выясняем, какой терминатор используется.
- Никого не волнует, когда он загружает время, необходимое для рендеринга в richtextbox. Это просто начальная загрузка текста.
Теперь по вопросам:
- Могу ли я просто использовать StreamReader, затем проверить свойство Length (например, ProgressMax) и выдать Read для установленного размера буфера и выполнить итерацию в цикле while WHILST внутри фонового работника, так что он не ' заблокировать основной поток пользовательского интерфейса? Затем верните построитель строк в основной поток после его завершения.
- Содержимое будет отправлено в StringBuilder. я могу инициализировать StringBuilder с размером потока, если длина доступна?
Это (по вашему профессиональному мнению) хорошие идеи? В прошлом у меня было несколько проблем с чтением контента из Streams, потому что он всегда будет пропускать последние несколько байтов или что-то еще, но я задам другой вопрос, если это так.