如何在应用程序关闭前将内容写入文本文件

3
我想要将文本写入到一个文件中,但是有一个小问题。当我使用下面的代码时,它只会写入一次。
        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); 以追加到文件。 - FooLman
你的目标是在应用程序结束前追加文本并将其写入磁盘吗? - Oybek
5个回答

2

根据您的描述,我认为您提供的代码片段是在一个循环中的。

如果将文件的打开/关闭移出循环(这也会解决您的问题),很可能会获得更好的性能。

如果您真的想每次打开/关闭文件,则应指定追加标志。

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

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

谢谢,这个方法可行,但它不能覆盖原有文件。有没有办法在每次启动应用程序时都进行覆盖? - Samet
添加了如何清除文件的内容 - 实质上是用空字符覆盖文件并保存。 - ChrisBD
我不明白。我需要同时使用两个版本吗?我的意思是,EDIT版本将位于应用程序的开头,我不保存任何内容。代码的第一部分将放在我想要保存的位置上吗? - Samet

1
我建议您使用带有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();
    }
}

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


0

如果已经存在test.txt,那么流编写器的构造函数将删除它。因此,每次执行该代码片段时,它都会删除先前创建的文件text.txt。相反,使用streamwriter构造函数的重载,该构造函数需要一个额外的bool参数来追加到现有的test.txt文件而不是替换它:

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

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

或者,您可以选择像NLog这样的日志框架。在这种情况下,NLog将处理所有文件操作,因此您就不必担心了。此外,您可以配置NLog以写入任何您喜欢的内容,例如您的文件,调试输出窗口或事件日志等等。此外,您可以肯定任何文件操作可能比您自己的实现更有效率。


0

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

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


你可能还想了解现有的日志框架。有许多现有的框架,没有必要重复造轮子。个人建议使用 Common.Logging 并选择一个后端。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接