我想写一个文本文件,但我的问题很小。使用下面的代码时,它只写一次。
StreamWriter fileWriter = new StreamWriter("test.txt");
fileWriter.WriteLine(jointHead.Position.X);
fileWriter.Close();
当我写这样的时候:
Debug.WriteLine(jointHead.Position.X);
它写入X位置,直到我关闭应用程序。在关闭应用程序之前,如何写入文本文件,就像我在调试模式下编写一样。如果我从它所在的位置获取fileWrite.Close(),程序就无法工作。
谢谢...
答案 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
和你选择的后端。