该进程无法访问该文件,因为该文件正由另一个进程使用

时间:2010-08-11 11:23:14

标签: c# multithreading file-io

当我执行下面的代码时,我得到了常见的异常The process cannot access the file *filePath* because it is being used by another process

允许此线程等到可以安全访问此文件的最有效方法是什么?

假设:

  • 该文件刚刚由我创建,因此其他应用程序不太可能正在访问它。
  • 我应用中的多个帖子可能会尝试运行此代码以将文字附加到文件中。

 using (var fs = File.Open(filePath, FileMode.Append)) //Exception here
 {
     using (var sw = new StreamWriter(fs))
     {
         sw.WriteLine(text);
     }
 }

到目前为止,我提出的最好的是以下内容。这样做有什么缺点吗?

    private static void WriteToFile(string filePath, string text, int retries)
    {
        const int maxRetries = 10;
        try
        {
            using (var fs = File.Open(filePath, FileMode.Append))
            {
                using (var sw = new StreamWriter(fs))
                {
                    sw.WriteLine(text);
                }
            }
        }
        catch (IOException)
        {
            if (retries < maxRetries)
            {
                Thread.Sleep(1);
                WriteToFile(filePath, text, retries + 1);
            }
            else
            {
                throw new Exception("Max retries reached.");
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

如果您有多个线程尝试访问同一文件,请考虑使用锁定机制。最简单的形式可能是:

lock(someSharedObject)
{
    using (var fs = File.Open(filePath, FileMode.Append)) //Exception here
    {
        using (var sw = new StreamWriter(fs))
        {
            sw.WriteLine(text);
        }
    }
}

作为替代方案,请考虑:

File.AppendText(text);

答案 1 :(得分:2)

您可以设置FileShare以允许使用此File.Open命令进行多次访问,例如

File.Open(path, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)

但我认为,如果你有多个线程尝试写入一个文件,最简洁的方法是将所有这些消息放入Queue<T>,并有一个额外的线程将队列的所有元素写入文件。