跨进程的File.Exists()和文件访问同步

时间:2010-09-28 23:43:25

标签: c# .net mutex

我有几个应用程序在不同的进程中运行,每个进程都写入硬盘驱动器上的中央xml文档。我使用命名的互斥锁来同步对文件的访问 - 但经常得到以下异常:

System.IO.IOException: The requested operation cannot be performed on a file with a user-mapped section open.

我意识到在获取互斥锁上的锁之前我正在调用File.Exists()方法,这可能是原因吗?

更简单的说,任何人都可以确认该方法是否对文件执行读取检查是否存在?我想知道在检查文件是否存在之前是否需要锁定互斥锁。 我确实没有运行AV软件,因为这个异常似乎很常见。

当前代码的粗略示例:

private bool UpdateFile(string Text)
{
  if (!File.Exists(@"C:\FileName.xml"))
    return false;
  else
  {
    using (Mutex mutex = new Mutex(false, "ExampleMutexName"))
    {
      mutex.WaitOne(); 
      //Write to the file
      mutex.ReleaseMutex();
    }
    return true;
  }
}

编辑:我没有使用全局互斥锁,因为所有内容都运行在同一个用户帐户中 - 所以我相信本地互斥锁会没问题。但是,我开始的其中一个过程是冒充 - 这就是为什么我应该使用全局互斥锁。我的错误只是认为一切都在同一个用户帐户中运行,并且没问题。

1 个答案:

答案 0 :(得分:1)

  1. File.Exists在出现错误时返回false并且不抛出。虽然它检查读取权限,但它不会读取文件的内容。
  2. 在锁定互斥锁之前检查文件是否存在没有多大意义,因为它会导致竞争条件。在您的检查之后和锁定互斥锁之前,可以由其他人删除文件等。
  3. 您使用的互斥锁不是全局的,因此无法保证同一类型的其他应用程序不会并行修改文件。即使它是全局的,当某些应用程序不遵守锁定时也存在问题。这里最好的方法是使用文件锁定。请参阅LockUnlock
  4. 您看到的错误基本上意味着该文件由另一个进程打开,建议使用内存映射区域。
  5. P.S。:从索引服务中排除此文件也很不错。