【问题标题】:StreamReader in textbox文本框中的 StreamReader
【发布时间】:2017-01-06 23:18:09
【问题描述】:

我正在尝试使用 StreamReader 读取文本文件并在文本框中显示结果,但每次我尝试这样做时,我的文本框最终都会冻结。控制台中的相同结果似乎工作正常。到目前为止,这是我的代码。

private void ReadFile_Click(object sender, EventArgs e)
    {
     string line = "";
     bool IsActive = true;
        try
        {
            using (StreamReader file = new StreamReader("C:\\test.txt"))
            {
                while (!file.EndOfStream)
                {
                    line = file.ReadLine();
                    textBox1.Text = file.ReadLine();
              }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "File not found");
            return;
        }
    }

【问题讨论】:

  • 我认为在您的控制台中您拥有权限,但在您的应用程序中,您可能会被限制在它可以访问的路径中。尝试在您的应用程序中创建一个文件夹并将文本文件放入其中。另外,你为什么不创建一个字符串生成器(比如 StringBuilder sb = new ...)并将你的行附加到它,然后将读取所有行的结果作为 textBox1.text = sb 传递。如果您尝试一次将一行传递到您的文本框,您最终只会读取最后一行。

标签: c# asp.net .net string file


【解决方案1】:

您正在更新 while 循环中的文本框,这很可能会锁定 GUI 线程(取决于您的文件有多大),您还会丢失一些原始文件内容。

我建议您使用StringBuilder 构建文件内容,然后将该对象的内容分配到循环之外,这将优化性能。

例子:

StringBuilder builder = new StringBuilder();

while (!file.EndOfStream)
{
   builder.Append(file.ReadLine());
}

textBox.Text = builder.ToString();

您也可以将文件操作放在另一个ThreadTask 上并比较性能。

【讨论】:

  • 谢谢。我会尝试使用它。
  • @SmartDeveloper - 仍然使用流阅读器(这就是您获取文件内容的方式)。 StringBuilder 将跟踪文件中的内容。然后,您将 builder 对象分配给文本框(循环外),就像我在答案中显示的那样。
  • 最后一个问题,当它读取我知道文本框中正在发生的大量文本时,有什么我可以使用的吗?文本文件中有大约 30,000 条记录,尝试任何方法都会完全冻结。
  • @SmartDeveloper - 你可以考虑把它放在一个单独的线程上,这样 GUI 线程就不会被锁定,我还会向用户显示某种通知,告诉用户正在后台加载某些东西。跨度>
【解决方案2】:

这篇文章似乎很老了,所以不确定你是否让它工作,但我在我的一些代码中使用了类似的东西,我用它来工作

textbox.AppendText(stringName)

【讨论】:

    【解决方案3】:

    这段代码很奇怪:

    while (!file.EndOfStream)
    {
        line = file.ReadLine();
        textBox1.Text = file.ReadLine();
    }
    

    您似乎一遍又一遍地覆盖文本框。当您的代码运行完毕后,只会显示最后一行。此外,您只显示每隔一行,因为每隔一行存储在变量 line 中,然后被丢弃而不显示。

    我想你是说

    while (!file.EndOfStream)
    {
        textBox1.Text += file.ReadLine();
    }
    

    或许

    while (!file.EndOfStream)
    {
        textBox1.Text += ("\n" + file.ReadLine());
    }
    

    另外,请确保 textBox1 设置为 Multiline

    【讨论】:

    • 我最终做了这样的事情:while (!file.EndOfStream) { //Sb.Append(file.ReadLine()); textBox1.Text += file.ReadLine() + "\r\n";应用程序.DoEvents(); }
    • 我仍然无法快速读取大文本文件。
    • 有什么特殊原因需要一次读一行吗?
    • 一旦我进行了一些更改,我必须将文件再次写入文本文件。
    • 文本文件到文本框 -> 进行更改 -> 写回文本文件。
    【解决方案4】:

    阅读速度更快

    尝试一次读取整个文件,而不是一次读取一行。所有那些单独更新文本框以添加一行将变得非常缓慢。

    如果文件非常大,您也可以使用ReadToEndAsync,但您必须弄清楚如何处理其余的用户体验。无论如何,如果文件那么大,你应该probably not be using an ordinary textbox

    请注意,您可能需要从文件到文本框进行换行转换,具体取决于格式。我认为文本框仅使用 \n\ 分隔多行,而您的文件系统可能使用 \r\n

    private void ReadFile_Click(object sender, EventArgs e)
    {
        try
        {
            using (StreamReader file = new StreamReader("C:\\test.txt"))
            {
                var temp = file.ReadToEnd();
                // temp = temp.Replace("\r\n","\n");  You may or may not have to do something like this 
                textBox1.Text = temp;
            }
        }
        catch (FileNotFoundException ex)
        {
            MessageBox.Show(ex.Message, "File not found");
            return;
        }
    

    【讨论】:

    • 如果我一次读取整个文件,我无法读取每一行并检查记录是否正确。截至目前,我正在阅读该文件,但正如您所说,大文件可能会导致问题。
    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多