当我写信息,以文件和程序的多个副本runnnig我得到这个错误:
该进程无法访问文件“C:\日志\ log.txt的”,因为它正由另一个进程使用。
代码如下:
// create a writer and open the file
TextWriter tw2 = File.AppendText(@"C:\logs\log.txt");
// write a line of text to the file
tw2.WriteLine(Environment.NewLine);
tw2.WriteLine(DateTime.Now + " " + "IN INFOSERVCALLER");
tw2.Flush();
如何做到这一点的正确方法吗?
始终封装这种代码在using
语句
using(TextWriter tw2 = File.AppendText(@"C:\logs\log.txt"))
{
tw2.WriteLine(Environment.NewLine);
tw2.WriteLine(DateTime.Now + " " + "IN INFOSERVCALLER");
//tw2.Flush(); // No need to flush because close alway flush.
}
在using
的声明块结束通话tw2.Close()。
此外,如果你得到,而块内的异常。
现在,如果你的应用程序的其他实例由于某种原因失败时,该文件没有更多的锁定
使用互斥类同步访问从多个进程日志文件。 调用了WaitOne你打开文件,并调用之前ReleaseMutex你关闭文件后(冲洗是不够的,必须关闭文件或包装在使用关键字,其他的答案中提到)写入完成。 互斥名应以前缀“全球\”开始。
除了法拉盛,你必须Close()
的文件。
此外,如果另一个实例是在同一时间写文件,你不能访问它(直到其他程序调用Close()
。
TextWriter.Close方法
关闭作家的当前实例并释放与writer关联的所有系统资源
在这种情况下,“系统资源”是指不断锁定状态,直到关闭它的文件。
你需要在每次打开文件与文本编写时间关闭。
所以每次操作后使用
// create a writer and open the file
TextWriter tw2 = File.AppendText(@"C:\logs\log.txt");
// write a line of text to the file
tw2.WriteLine(Environment.NewLine);
tw2.WriteLine(DateTime.Now + " " + "IN INFOSERVCALLER");
tw2.Flush();
tw2.Close();
之后,再次尝试在写不会再产生任何问题。