如何在应用程序关闭之前写入文本文件

Posted

技术标签:

【中文标题】如何在应用程序关闭之前写入文本文件【英文标题】: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);追加到文件中。 除非应用程序结束并将其写入磁盘,否则您的目标是追加文本吗? 【参考方案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 配置为写入您喜欢的任何内容,例如您的文件,或者,如您所提到的,调试输出窗口或事件日志等。此外,您可以打赌任何文件操作可能会更多比你自己的实现更高效。

【讨论】:

以上是关于如何在应用程序关闭之前写入文本文件的主要内容,如果未能解决你的问题,请参考以下文章

python操作文本文件

如何在java中的文本文件中写入而不删除之前的文件内容

如何在将无限的文本流写入文件之前对其进行预处理?

写入/读取文本文件 (C#)

如何将文本写入服务器端文件

python如何写入文本的最末行?