Как CreateFile может завершиться ошибкой с FILE_SHARE_READ и преуспеть с FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE? - PullRequest
6 голосов
/ 17 марта 2011

Попробуйте сами:

Создайте файл XLS, откройте его в Excel.

Откройте sysinternals Process Monitor и наблюдайте, что происходит, когда вы копируете свой файл XLS в проводнике (просто нажмите ctrl-c ctrl-v).

Два вызова ::CreateProcess подряд. Первый вызов запрашивает разрешения на чтение и получает доступ запрещен. Второй вызов запрашивает чтение, запись, удаление и передачу.

Это нормально?

Ответы [ 2 ]

11 голосов
/ 17 марта 2011

Если вы открываете файл с FILE_SHARE_READ, вы говорите, что готовы поделиться доступом к этому файлу, но только для чтения.

Если вы открываете все флаги, вы готовы поделиться доступом и для записи / удаления.

FILE_SHARE_READ является более строгим, чем FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE

Если какой-то другой процесс (excel) открыл этот файл, например, для write (и у него установлены флаги общего доступа), единственный способ получить к нему доступ - это разрешить его общий доступ для записи.

3 голосов
/ 17 марта 2011

Вы должны использовать совместимые режимы обмена.Если Excel открывает файл с FILE_SHARE_READ |FILE_SHARE_WRITE тогда последующие попытки открыть файл должны использовать хотя бы те же флаги.В частности, из документации MSDN для CreateFile :

Нельзя запрашивать режим совместного использования, который конфликтует с режимом доступа, указанным в существующем запросе с открытым дескриптором.Сбой CreateFile, и функция GetLastError вернет ERROR_SHARING_VIOLATION.

...