我有一个可爱的任务,要弄清楚如何处理被加载到应用程序的脚本编辑器中的大文件(就像我们的内部产品的VBA一样,用于快速宏)。大多数文件约为300-400 KB,可以很好地加载。但是,当它们超过100 MB时,该过程将很困难(如您所料)。
发生的情况是将文件读取并推入RichTextBox中,然后进行导航-不必过多担心这一部分。
编写初始代码的开发人员只需使用StreamReader并执行
[Reader].ReadToEnd()
这可能需要一段时间才能完成。
我的任务是分解这段代码,将其分块读取到缓冲区中,并显示一个带有取消它选项的进度条。
一些假设:
- 大多数文件将为30-40 MB
- 文件的内容是文本(不是二进制),有些是Unix格式,有些是DOS。
- 检索到内容后,我们便确定使用了哪种终止符。
- 一旦加载了RichTextBox中呈现所需的时间,就没有人关心。这只是文本的初始加载。
现在开始提问:
- 我可以简单地使用StreamReader,然后检查Length属性(即ProgressMax)并发出Read来获取设置的缓冲区大小,并在后台工作程序内的while循环WHILST中进行迭代,以便它不会阻塞主UI线程吗?然后,在完成后将stringbuilder返回到主线程。
- 内容将转到StringBuilder。如果长度可用,我如何用流的大小初始化StringBuilder?
这些(根据您的专业意见)是好主意吗?过去,我从Streams读取内容时遇到了一些问题,因为它总是会丢失最后几个字节或其他内容,但是如果是这种情况,我会问另一个问题。