3

当我将信息写入文件并运行多个程序副本时,我收到此错误:

该进程无法访问文件“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();

如何以正确的方式做到这一点?

4

4 回答 4

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()。
此外,如果您在块内遇到异常。

现在,如果您的应用程序的其他实例由于某种原因失败,则该文件不再被锁定

于 2012-04-18T13:30:59.483 回答
1

使用Mutex类同步多个进程对日志文件的访问。在打开文件之前调用WaitOne并在关闭文件后调用ReleaseMutex(刷新是不够的,您必须关闭文件或使用关键字将其包装,如其他答案所述)写入完成后。互斥体名称应以前缀“Global\”开头。

于 2012-04-18T14:10:59.253 回答
0

除了法拉盛,你必须要Close()文件。

此外,如果另一个实例同时正在写入该文件,则您无法访问它(直到其他程序调用Close().

TextWriter.Close 方法

关闭 writer 的当前实例并释放与 writer 关联的所有系统资源

在这种情况下,“系统资源”是指在您关闭之前一直锁定的文件。

于 2012-04-18T13:23:39.897 回答
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(); 

之后再次尝试写,不会进一步产生任何问题。

于 2012-04-18T13:25:14.117 回答