【问题标题】:StreamWriter only writes first lineStreamWriter 只写第一行
【发布时间】:2012-02-12 17:27:48
【问题描述】:

我有一个使用这种方法的 C# .NET 3.5 Windows 窗体程序:

    private void toLog(string sLog)
    {
        richTextBox1.Text += DateTime.Now.ToString("T") + ": " + sLog + "\n";
        richTextBox1.Update();
        richTextBox1.Refresh();
        using (StreamWriter writer = new StreamWriter("log.txt", true))
        {
            writer.WriteLine(DateTime.Now.ToString("T") + ": " + sLog);
            writer.Flush();
            writer.Dispose();
        }

    }

这个想法是我可以用它提交日志条目,它会将条目写入富文本框和日志文件。

事情是这样的……streamwriter 只在第一次调用该方法时才写入!富文本框更新很棒。 Flush() 和 Dispose() 是我后来出于绝望尝试的东西,但我想 using 块应该可以处理。

有什么想法吗?谢谢!

【问题讨论】:

  • 您确定没有在其他地方抛出和捕获异常吗?
  • 可能有更好的方法,这就是为什么我在 cmets 中发布这个而不是回答,但我会尝试将 log.txt 作为文件流打开,然后将其复制到作者之前我开始写作了。
  • writer.Flush()writer.Dispose() 行肯定是多余的。否则,我无法复制您的问题。您要写入哪个文件夹?也许尝试写信给“我的文档”?
  • 我的第一个猜测是,WriteLine() 抛出了 IOException,并且正在代码的其他地方处理。将 StreamWriter 代码包装在 try 块中,并在 catch(IOException) 块中设置断点。哦,讽刺的是,如果您的日志记录方法没有记录它本身抛出的异常。
  • 对不起,我应该提到它最初是在一个 try-catch 块中并且它没有抛出错误......我把它减少到这个(减去 flush()并 dispose()) 尝试缩小范围。

标签: c# streamwriter


【解决方案1】:

我认为问题可能出在StreamWriter("log.txt",:路径可以在您的应用程序内更改,因此您最好在此处使用完整路径。
示例:

string dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string log = Path.Combine(dir, "log.txt");
using (StreamWriter writer = new StreamWriter(log, true))

【讨论】:

  • 我会尝试并报告,但它正在成功写出文件......只是第一次。
  • 这行得通!你能详细说明这里发生了什么吗?为什么它只工作一次,然后就不再工作了?
  • 我把我的原始代码放回了那里,但使用了 log.txt 的完整路径,它也可以工作
  • @MichaelNelson:您必须知道,当您使用文件时,默认目录可以更改。所以,我想你第一次写“log.txt”默认目录是你的exe所在的目录;可能该目录已更改,因此下次您的 exe 在默认目录中搜索“log.txt”时,这与前一个不同!因此,请记住,始终使用全名以避免问题并浪费时间来查找错误:) 最后,请记住,如果这解决了(或帮助解决了)您的问题,您应该 accept an answer
  • @MichaelNelson:问题不在于代码的那一部分,而在于默认目录被更改的其他部分。如果您使用 Everything 之类的工具,您可以快速找到所有 log.txt 文件并了解它们的位置,以及您的应用程序在哪里编写它们...
【解决方案2】:

我知道我参加聚会迟到了,但这有助于我解决类似的情况,也许它会帮助其他人。

我遇到了同样的问题,streamwriter 只写文件的第一行,没有别的。我能够通过使用 FileStream 来修复它:

using (FileStream fileStream = File.Open("log.txt", FileMode.Open))
{
    using (StreamWriter streamWriter= new StreamWriter(fileStream))
    { 
        writer.WriteLine(DateTime.Now.ToString("T") + ": " + sLog);
    }
}

【讨论】:

    【解决方案3】:

    您可以使用以下示例:

    using (StreamWriter writer = File.AppendText("log.txt")) 
    {
        writer.WriteLine(DateTime.Now.ToString("T") + ": " + sLog);
    }   
    

    Flush 和 Dispose 不需要在 using 块的末尾使用,因为它们会被隐式调用。

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 1970-01-01
      • 2017-08-13
      • 2011-06-25
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多