从多个程序实例将文本写入文件

时间:2012-04-18 13:20:35

标签: c# file-io io

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

  

进程无法访问文件'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 个答案:

答案 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}}。

TextWriter.Close Method

  

关闭当前的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(); 

之后再尝试写一下,不会再造成任何问题。