写文字,从程序的多个实例文件(Writing text to file from multiple

2019-09-16 14:43发布

当我写信息,以文件和程序的多个副本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();

如何做到这一点的正确方法吗?

Answer 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()。
此外,如果你得到,而块内的异常。

现在,如果你的应用程序的其他实例由于某种原因失败时,该文件没有更多的锁定



Answer 2:

使用互斥类同步访问从多个进程日志文件。 调用了WaitOne你打开文件,并调用之前ReleaseMutex你关闭文件后(冲洗是不够的,必须关闭文件或包装在使用关键字,其他的答案中提到)写入完成。 互斥名应以前缀“全球\”开始。



Answer 3:

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

此外,如果另一个实例是在同一时间写文件,你不能访问它(直到其他程序调用Close()

TextWriter.Close方法

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

在这种情况下,“系统资源”是指不断锁定状态,直到关闭它的文件。



Answer 4:

你需要在每次打开文件与文本编写时间关闭。

所以每次操作后使用

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

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



文章来源: Writing text to file from multiple instances of program
标签: c# file-io io