Синхронная запись в файл, открытый с помощью FILE_FLAG_OVERLAPPED - PullRequest
3 голосов
/ 12 июля 2011

Я открыл файл, используя

HANDLE handle= 
    CreateFileW(
        fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 
        FILE_FLAG_OVERLAPPED, NULL);

Дескриптор файла затем используется для асинхронных операций чтения:

ReadFile(handle, buffer, 1, NULL, &overlapped);

Это работает. Тем не менее, я хочу сделать синхронную запись сейчас. WriteFile документация гласит, что

Если hFile был открыт с FILE_FLAG_OVERLAPPED, действуют следующие условия:
• Параметр lpOverlapped должен указывать на действительную и уникальную структуру OVERLAPPED, в противном случае функция может неправильно сообщить о завершении операции записи.

Если параметр lpOverlapepd не указан, GetLastError() возвращает ERROR_INVALID_PARAMETER. Открытие двух дескрипторов, одного для чтения и одного для записи, также не работает, поскольку второй дескриптор выдает ошибку ERROR_ACCESS_DENIED.

Как открыть файл для асинхронного чтения и синхронной записи? Я не хочу увеличивать сложность кода без необходимости.

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Синхронная запись может быть достигнута путем создания события ручного сброса для операции записи, записи в файл (используя событие в перекрывающейся структуре для вашей операции записи) и последующего немедленного ожидания события.

В зависимости от того, должно ли асинхронное чтение быть асинхронным с вашей записью, вам может потребоваться убедиться, что вы используете совместимое ожидание, чтобы можно было вызывать подпрограмму завершения чтения, иначе чтение будет иметь место, и данные будут сохранены в буфер, но вы не можете его обработать.

0 голосов
/ 12 июля 2011

Откройте два дескриптора, один для асинхронного чтения, другой для синхронной записи, просто убедитесь, что вы задали атрибуты общего файла (FILE_SHARE_READ|FILE_SHARE_WRITE).Не проверял это.

...