File.Exists () и синхронизация доступа к файлам между процессами - PullRequest
2 голосов
/ 29 сентября 2010

У меня есть пара приложений, запущенных в отдельных процессах, каждое из которых записывает в центральный XML-документ на жестком диске.Я использую именованный мьютекс для синхронизации доступа к файлу, но часто получаю следующее исключение:

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

Я понял, что вызываю метод File.Exists() до получения блокировки мьютекса, верно?возможно, что это может быть причиной?

Проще говоря, может ли кто-нибудь подтвердить, выполняет ли этот метод чтение файла, чтобы проверить, существует ли он?Мне интересно, нужно ли мне блокировать мьютекс перед проверкой наличия файла.Я проверил, что антивирусное программное обеспечение не запущено, так как это похоже на обычное исключение.

Грубый пример текущего кода:

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 Ответ

1 голос
/ 29 сентября 2010
  1. File.Exists возвращает false в случае ошибок и не выдает.Он не читает содержимое файла, хотя проверяет наличие разрешений на чтение.
  2. Не имеет смысла проверять, существует ли файл перед блокировкой мьютекса, поскольку это приводит к условиям гонки.Файл может быть удален кем-то еще после вашей проверки и до того, как ваш мьютекс будет заблокирован.
  3. Используемый мьютекс не является глобальным, поэтому нет гарантии, что другое приложение такого же типа не изменяет файлв параллели.Даже если это было глобально, есть проблема, когда некоторое приложение не соблюдает блокировку.Лучший способ сделать это - использовать блокировку файлов.См. Блокировка и Разблокировка .
  4. Ошибка, которую вы видите, в основном означает, что файл открывается другим процессом, предлагая отображенную область памяти.

PS: Было бы также неплохо исключить этот файл из службы индексирования.

...