Блокировать файл, но разрешить использование текущим процессом? - PullRequest
2 голосов
/ 06 августа 2010

Я хочу иметь возможность заблокировать файл в Win32, чтобы он мог использоваться только моим текущим процессом.Наиболее очевидный способ сделать это, по-видимому, через CreateFile:

HANDLE file = ::CreateFile("c:\\foo.txt", 
                           GENERIC_READ | GENERIC_WRITE,
                           0,
                           NULL,
                           OPEN_EXISTING,
                           FILE_ATTRIBUTE_NORMAL,
                           NULL);

Однако, как только этот вызов завершился успешно, файл также, очевидно, заблокирован моим собственным процессом, т.е.Я получаю «нарушение совместного доступа», как только MFC Framework пытается открыть его.

Есть ли удобный способ предотвратить доступ к файлу другими процессами, но все же разрешить его моему?Я бы предпочел не заменять весь код инфраструктуры загрузки / сохранения ... Что-то не так с параметрами, которые я передаю в CreateFile?

Ответы [ 2 ]

4 голосов
/ 06 августа 2010

С Создание и открытие файлов :

Приложение также использует CreateFile для указать, хочет ли он поделиться файл для чтения, записи, или ни. Это известно как обмен Режим. Открытый файл, который не является общим (dwShareMode установлен в ноль) не может быть открыт снова, либо приложение, которое открыло его или другое приложение , пока его ручка был закрыт. Это также указано в качестве эксклюзивного доступа.

См. Также Как биты FILE_SHARE_ * взаимодействуют с нужными битами доступа?

1 голос
/ 06 августа 2010

Я не знаю ни одного простого способа сделать это. Что касается более сложных методов, вы можете:

  1. установить специальное имя пользователя для доступа к файлу.
  2. Открыть файл без общего доступа.
  3. Отредактируйте ACL, чтобы разрешить использование только от специального имени пользователя
  4. Закройте файл.
  5. Олицетворение этого пользователя
  6. Открыть файл, разрешив общий доступ
  7. Закрыть файл
  8. Установите ACL обратно, чтобы разрешить другим пользователям доступ

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

...