如何在应用程序关闭之前写入文本文件
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 配置为写入您喜欢的任何内容,例如您的文件,或者,如您所提到的,调试输出窗口或事件日志等。此外,您可以打赌任何文件操作可能会更多比你自己的实现更高效。
【讨论】:
以上是关于如何在应用程序关闭之前写入文本文件的主要内容,如果未能解决你的问题,请参考以下文章