当我将信息写入文件并运行多个程序副本时,我收到此错误:
进程无法访问文件'C:\ logs \ 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();
如何正确地做到这一点?
答案 0 :(得分:1)
始终将此类代码封装在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()
此外,如果你在街区内遇到异常。
现在,如果您的应用程序的其他实例由于某种原因而失败,则该文件不再被锁定
答案 1 :(得分:1)
使用Mutex类来同步对来自多个进程的日志文件的访问。在打开文件之前调用WaitOne并在关闭文件后调用ReleaseMutex(Flush是不够的,您必须关闭文件或使用关键字将其包装,如提及的其他答案)。互斥名称应以前缀“Global \”开头。
答案 2 :(得分:0)
除法拉盛外,您必须Close()
该文件。
此外,如果另一个实例同时写入文件,则无法访问它(直到其他程序调用{{1}}。
关闭当前的writer实例并释放与writer
相关的所有系统资源
在这种情况下,“系统资源”是指在您关闭之前保持锁定的文件。
答案 3 :(得分:0)
每次使用文本编写器打开文件时都需要关闭。
所以每次操作后都要使用
// 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();
之后再尝试写一下,不会再造成任何问题。