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

时间:2012-02-13 13:36:34

标签: c# save text-files

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

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

当我写这样的时候:

        Debug.WriteLine(jointHead.Position.X);

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

谢谢...

5 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

尝试

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

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

修改

如果您希望在应用程序开始时清除该文件,请执行以下操作:

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

答案 2 :(得分:1)

我建议您使用某种带有字符串构建器的记录器。

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

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

答案 3 :(得分:0)

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

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

或者,您可以使用File.AppendAllLines方法将文本附加到文件中。那么你不必担心关闭文件句柄,方法名称本身清楚地说明会发生什么。对我来说,这将更加方便,而不是像重载的streamwriter构造函数那样模糊。

或者,您可以选择NLog之类的日志框架。在这种情况下,NLog将负责您的所有文件操作,这样您就可以免于担心。另外,您可以将NLog配置为写入您喜欢的任何内容,例如您的文件,或者如您所述,调试输出窗口或事件日志等等,您可以打赌任何文件操作可能更多比你自己的实现更有效率。

答案 4 :(得分:0)

保持流编写器打开。但请在Flush来电后致电WriteLine

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


您可能还想查看现有的日志记录框架。有许多现有的,不需要重新发明轮子。就个人而言,我会使用Common.Logging和你选择的后端。