Почему fopen успешно работает там, где не работает CreateFile? - PullRequest
0 голосов
/ 28 мая 2018

В моей 64-битной системе Win7 я создаю много текстовых файлов со своей собственной программой, которая использует:

hLogFile = CreateFile (LogFileSpec,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,
                     CREATE_ALWAYS,FILE_FLAG_RANDOM_ACCESS,NULL);

Когда один из этих файлов открыт (отображается на экране), я не могу открыть его снова(нарушение совместного доступа к файлам) в другой программе, используя:

hSrcFile = CreateFile (SrcSpec,GENERIC_READ,FILE_SHARE_READ,NULL,
                     OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

Однако, когда один из этих файлов открыт (отображается на экране), я могу открыть его снова в другой программе, используя:

hFile = fopen(FileSpec,"rb"); 

Кто-нибудь знает, что здесь происходит?Почему ОБА методы не могут открыть текущий отображаемый файл в режиме совместного использования?

Я действительно не хочу возвращаться к прошлому году и использовать fopen() материал из библиотеки времени выполнения C, но я не могунайдите что-нибудь в Win32 API, которое выполнит эту работу.Есть идеи?

1 Ответ

0 голосов
/ 28 мая 2018

Первый CreateFile() создает файл для чтения и записи и предоставляет доступ только для чтения.

Второй CreateFile() открывает файл только для чтения (ОК), но совместно используетДоступ только для чтения (нарушение общего доступа).

Поскольку файл открыт для записи, а второй вызов не включает общий доступ для записи, второй вызов завершается неудачей.

Необходимо добавить FILE_SHARE_WRITE на второй звонок:

hSrcFile = CreateFile (SrcSpec, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...