我得承担起处理大文件被加载到我们应用程序脚本编辑器(它类似于我们内部产品的VBA,用于快速宏)的可爱任务。大多数文件大小在300-400 KB左右,这样加载是没有问题的。但当它们超过100 MB时,这个过程就会变得困难(正如你所预料的那样)。
发生的情况是,文件被读取并推入一个RichTextBox中,然后进行导航 - 不要太担心这部分内容。
最初编写代码的开发人员只是使用StreamReader并执行以下操作:
发生的情况是,文件被读取并推入一个RichTextBox中,然后进行导航 - 不要太担心这部分内容。
最初编写代码的开发人员只是使用StreamReader并执行以下操作:
[Reader].ReadToEnd()
这可能需要相当长的时间才能完成。
我的任务是将这段代码分解,将其分块读入缓冲区并显示进度条,同时提供取消选项。
一些假设:
- 大多数文件的大小为30-40 MB
- 文件内容为文本(而非二进制),有些是Unix格式,有些是DOS格式。
- 一旦获取到内容,我们会确定使用的终止符。
- 加载到richtextbox中后的渲染时间不是问题,只是初始文本加载时间较长。
现在是问题:
- 我可以简单地使用StreamReader,然后检查Length属性(因此ProgressMax),发出一次针对固定缓冲区大小的读取,并在while循环内迭代,同时在后台工作器中进行,以便不阻塞主UI线程?完成后将stringbuilder返回给主线程。
- 内容将被放入StringBuilder。如果长度可用,我可以使用流的大小初始化StringBuilder吗?
在您的专业意见中,这些是好主意吗?过去我曾遇到从流中读取内容时的一些问题,因为它总是会错过最后几个字节或其他东西,但如果是这种情况,我会问另一个问题。
foreach (string line in File.ReadLines(path).Skip(skip))
。那太糟糕了。 - mafu