高级阅读文件

时间:2014-04-21 13:36:13

标签: c# io backgroundworker

我确信我们都熟悉并可能使用书籍,在线等提供的大量代码来使用C#读取文件。像......一样简单......

StringBuilder fiContents = new StringBuilder();
using (StreamReader fi = new StreamReader(@"C:\a_file.txt"))
{
    while (!fi.EndOfStream)
    {
        fiContents.Append(fi.ReadLine); 
    }
}

或许可能像......那样简短。

using (StreamReader fi = new StreamReader(@"C:\a_file.txt"))
    fiContents.Append(fi.ReadToEnd());

现在让我们去超级赛亚人一会儿做一些真正有趣的东西,比如有一个BackgroundWorker可以让我们显示一个加载图像(我将使用它),提供一个进程倒数计时器或{{1 }}。

ProgressBar

++++++++++++++++++++++++++++++++++++++++

实际问题的时间......以上是热身并展示当前的理解水平,因此我不会将这些视为未来的答案。

我正在做上面给出的最后一个代码示例(即使用public void ReadFile(string filename) { BackgroundWorker procFile = new BackgroundWorker(); // Progress 1: If we want to show the progress we need to enable the following property // procFile.WorkerReportsProgress = true; profile.DoWork += new DoWorkEventHandler((object obj, DoWorkEventArgs ev) => { StringBuilder fiContents = new StringBuilder(); using (StreamReader fi = new StreamReader(filename)) { while (!fi.EndOfStream) { // Progress 2: Report the progress, this will be dealt with by the respective handler (below). // procFile.ReportProgress((int)(fi.BaseStream.Length / fi.BaseStream.Position) / 100); fiContents.Append(fi.ReadLine); } } ev.Result = fiContents; } /* Progress 3: The handler below will take care of updating the progress of the file as it's processed. procFile.ProgressChanged += new ProgressChangedEventHandler((object obj, ProgressChangedEventArgs ev) => { // Progress 4: Do something with the value, such as update a ProgressBar. // .... } */ procFile.RunWorkerCompleted += new RunWorkerCompletedEventHandler((object obj, RunWorkerCompletedEventArgs ev) => { // Do something with the result (ev.Result), bearing in mind, it is a StringBuilder and the ev.Result is an object. StringBuilder result = ev.Result as StringBuilder; // .... } } )并将读取的内容转储到BackgroundWorker。简单的东西真的。

我面临的问题是处理大文件(例如~222MB)。这个案例只是一个.txt,读取它,将它通过RichTextBox建立的结果推送到StringBuilder。它无法加载文件,我得到RichTextBox。解决此问题的一种方法是花费相当多的时间(仍然不加载文件),迭代字符串并从文件OutOfMemoryException添加每个字符(作为char)。

我一直使用最基本,最直接的方式来阅读文件(例如上面给出的例子),但有没有人对如何改进这方面有任何指导?处理超大文件的方法?等。

即使是讨论作品,我也欢迎你的想法。

++++++++++++++++++++++++++++++++++++++++

编辑1 (@TaW):尝试将StringBuilder放入string时抛出异常...

RichTextBox

3 个答案:

答案 0 :(得分:2)

您是否有限制要求您使用RichTextBox作为控件来显示您的内容?此控件未虚拟化,将导致您的性能(以及内存错误的外观)问题。

有一系列document viewing controls更适合展示大型文档。根据您的需要存在各种控件(固定,通过页面或滚动流动)。此外,您还可以进行搜索,打印,缩放以及其他一些通常对查看大型文档有用的功能。

答案 1 :(得分:0)

您是否尝试了MemoryMapped

答案 2 :(得分:0)

这不是关于高级阅读,而是关于达到(Winforms)控件的容量限制。也许你可以在WPF中使用它,但在Winforms中,RichTextBox和TextBox都不能容纳如此大量的行/文本。

我建议你重新设计一下,以较小的块为用户呈现数据。并不是他们想要滚动100.000+行。在内存中处理它们不是问题;这里200MB并不大;例如,你可以在内存等中轻松搜索它。