【问题标题】:How to write to a text file until the application is closed如何在应用程序关闭之前写入文本文件
【发布时间】:2012-02-13 13:36:34
【问题描述】:

我想写入一个文本文件,但我有一个小问题。当使用下面的代码时,它只写一次。

        StreamWriter fileWriter = new StreamWriter("test.txt");
        fileWriter.WriteLine(jointHead.Position.X);       
        fileWriter.Close();

当我这样写时:

        Debug.WriteLine(jointHead.Position.X);

它会写入 X 位置,直到我关闭应用程序。在关闭应用程序之前,如何像在调试模式下写入一样写入文本文件。如果我从它所在的位置获取 fileWrite.Close(),程序将无法运行。

谢谢...

【问题讨论】:

  • 只需将相应的行更改为: StreamWriter fileWriter = new StreamWriter("test.txt",true);追加到文件中。
  • 除非应用程序结束并将其写入磁盘,否则您的目标是追加文本吗?

标签: c# save text-files


【解决方案1】:

根据您的描述,我假设您提供的代码 sn-ps 处于循环中。

通过将文件打开/关闭移到循环之外,您可能会获得更好的性能(这也可以解决您的问题)。

我真的想每次都打开/关闭文件,然后指定附加标志。

using (var fileWriter = new StreamWriter("test.txt", true))
{
    fileWriter.WriteLine(jointHead.Position.X);
}

【讨论】:

    【解决方案2】:

    试试

    StreamWriter fileWriter = new StreamWriter("test.txt", true);
            fileWriter.WriteLine(jointHead.Position.X);       
            fileWriter.Close();
    

    这将允许将写入的文本附加到文件的末尾。 此刻你的写作每次都从头开始。

    编辑

    如果您希望在应用程序启动时清除文件,则只需执行以下操作:

    StreamWriter fileWriter = new StreamWriter("test.txt");
                fileWriter.Write("");  
                fileWriter.Close();
    

    【讨论】:

    • 谢谢,这行得通,但它没有覆盖。每次启动应用程序时有什么方法可以覆盖吗?
    • 添加了如何清除文件 - 本质上用空字符覆盖文件并保存。
    • 我不明白。我会同时使用两者吗?我的意思是,编辑版本将在应用程序的开头,我不保存任何内容。代码的第一部分将在我要保存的地方?
    【解决方案3】:

    我宁愿建议你使用某种带有字符串生成器的记录器。

    public class Logger {
        private StringBuilder sb;
        public Logger() { 
            sb = new StringBuilder(); 
        }
        public Log(String log) {
            sb.Append(log).AppendLine();
        } 
        public void Flush() {
            File.WriteAllText(String.Format(@"D:\Logs\Log at {0:yyyy-MM-dd HH:mm:ss}.txt", DateTime.Now), sb.ToString());
            sb.Clear();
        }
    }
    

    这个类是更加优雅和可重用的解决方案。如果您的目标日志不是很大,这是可以接受的。

    【讨论】:

      【解决方案4】:

      保持流写入器打开。但是在WriteLine 调用之后再调用Flush

      或者,您可以打开文件进行追加,而不是为每一行重新创建它。


      您可能还想研究现有的日志记录框架。现有的很多,无需重新发明轮子。我个人会使用 Common.Logging 和您选择的后端。

      【讨论】:

        【解决方案5】:

        如果 test.txt 已经存在,streamwriter 的构造函数将删除它。所以每次执行这段代码时,它都会删除它之前创建的文件 text.txt 。相反,请使用 overload for the constructor of streamwriter,它需要一个额外的 bool 来附加到现有的 test.txt 文件而不是替换它:

        StreamWriter fileWriter = new StreamWriter("test.txt", true);
        

        或者,您可以使用File.AppendAllLines 方法将文本附加到文件中。那么您不必担心关闭文件句柄,并且方法名称本身清楚地说明了将要发生的事情。对我来说,这会更方便,也不会像重载的流写入器构造函数那样晦涩难懂。

        或者,您可以选择像NLog 这样的日志记录框架。在这种情况下,NLog 会处理你所有的文件操作,这样你就不用担心了。此外,您可以将 NLog 配置为写入您喜欢的任何内容,例如您的文件,或者,如您所提到的,调试输出窗口或事件日志等。此外,您可以打赌任何文件操作可能会更多比你自己的实现更高效。

        【讨论】:

          猜你喜欢
          • 2018-08-20
          • 2017-07-30
          • 2017-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-29
          • 2013-03-07
          • 1970-01-01
          相关资源
          最近更新 更多