【问题标题】:Writing text to file from multiple instances of program从程序的多个实例将文本写入文件
【发布时间】:2012-04-29 21:59:14
【问题描述】:

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

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

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

【问题讨论】:

  • 尝试先检查文件是否在使用中,看这个答案stackoverflow.com/a/937558/799586
  • @BaliC:首先检查文件是否被锁定的唯一问题是,在您检查文件和打开文件写入文件的时间之间,它仍然可能被锁定。最好尝试写入文件并在发生异常时捕获异常。然后稍后再试。

标签: c# file-io io


【解决方案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()。
如果您在块内遇到异常。

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

【讨论】:

  • 这里不需要刷新,因为隐式关闭也会刷新流。
  • “关闭”和“使用”都不会阻止异常的发生,只会降低异常的概率。多个程序实例仍有可能同时尝试打开日志文件。对文件的访问必须与适当的同步原语(例如 Mutex)同步。
  • @Ňuf 会发生异常,但是 using 块确保正确关闭文件,然后其他进程可以使用该文件而不会被锁定(至于刷新,你和 ShellShock 是对的,复制粘贴:))
  • 史蒂夫:问题是“如何以正确的方式做到这一点?”。当程序仍然抛出异常而不是写入文件时,恕我直言,这不是正确的方法。即使没有“using”语句,文件也会被正确关闭,唯一的区别是“using”将立即关闭文件,而没有“using”文件将在 desctuctor 中关闭(很多)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    除了Flushing,你还得Close()这个文件。

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

    TextWriter.Close Method

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

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

    【讨论】:

      【解决方案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(); 
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-09
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        • 2015-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多