高级阅读文件

use*_*809 6 c# io backgroundworker

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

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

或者可能是......

using (StreamReader fi = new StreamReader(@"C:\a_file.txt"))
    fiContents.Append(fi.ReadToEnd());
Run Code Online (Sandbox Code Playgroud)

现在让我们去超级赛亚人片刻做一些真正有趣的东西,比如有一个BackgroundWorker可以让我们显示一个加载图像(我将使用它),提供一个进程倒数计时器或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; 

         // ....
    }
}
Run Code Online (Sandbox Code Playgroud)

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

实际问题的时间......上面是一个热身,并显示当前的理解水平,所以我不会将这些作为预期答案.

我正在做上面给出的最后一个代码示例(即使用a BackgroundWorker)并将读取的内容转储到a RichTextBox.简单的东西真的.

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

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

即使作为讨论作品,我也欢迎你的想法.

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

编辑1(@TaW):试图把当异常被抛出stringRichTextBox...

FileProcessing.RunWorkerCompleted += new RunWorkerCompletedEventArgs((object obj, RunWorkerCompletedEventArgs e) =>
{
    // 'Code' is the RichTextBox in question...

    Code.Text = "";

    if (e.Result is StringBuilder)
    {
        Code.Text = (e.Result as StringBuilder).ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 0

您是否尝试过MemoryMapped
它对于处理大文件非常有用