如何写入文本文件,直到应用程序关闭

问题描述:

我想写入文本文件,但我有一个小问题。当使用下面的代码时,它只写一次。如何写入文本文件,直到应用程序关闭

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

当我写这样的:

 Debug.WriteLine(jointHead.Position.X); 

它,直到我关闭应用程序写入的X位置。我如何写入文本文件,如我在调试模式下写入,直到关闭应用程序。如果我从它所在的位置取fileWrite.Close(),程序就不起作用。

谢谢...

+0

只需将相应的行更改为:StreamWriter fileWriter = new StreamWriter(“test.txt”,true);附加到文件。 – FooLman 2012-02-13 13:39:36

+0

您的目标是追加文本,除非应用程序结束并将其写入磁盘? – Oybek 2012-02-13 13:40:03

尝试

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

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

编辑

如果要清除文件的应用程序的启动,然后只是执行以下操作:

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

谢谢,这工作,但它不写。每次启动应用程序时,是否有任何方法可以覆盖? – Samet 2012-02-13 14:13:16

+0

新增了如何清除文件 - 基本上用空字符覆盖文件并保存。 – ChrisBD 2012-02-13 15:05:07

+0

我不明白。我会同时使用两种吗?我的意思是,编辑verison将在应用程序的开始,我不保存任何东西。代码的第一部分将在我想要保存的地方? – Samet 2012-02-13 16:20:44

的StreamWriter的的该构造将删除test.txt的,如果它已经存在。所以每当这段代码被执行时,它将删除它之前创建的文件text.txt。相反,使用需要一个额外的布尔的overload for the constructor of streamwriter追加到现有的test.txt文件而不是替换它:

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

或者,你可以用File.AppendAllLines方法去追加文本的文件。那么你不必担心关闭文件句柄,方法名称本身就会清楚说明将会发生什么。对我来说,这会更方便,不像重载的Streamwriter构造函数那样晦涩难懂。

或者,您也可以使用日志框架,如NLog。在这种情况下,NLog将负责所有的文件操作,因此您无需担心。另外,你可以配置NLog来写任何你喜欢的东西,比如你的文件,或者如你所说的,调试输出窗口或者事件日志等等,你也可以在任何文件操作上下注比你自己的实现更有效率。

从你的描述我假设你给出的代码片段是在一个循环中。

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

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

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

保持流写入器打开。但拨打WriteLine后致电Flush

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


您可能还想看看现有的日志记录框架。有许多现有的,不需要重新发明*。我个人会使用Common.Logging与您选择的后端。

我宁愿建议你使用某种记录仪的使用一个stringbuilder。

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(); 
    } 
} 

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