Программирование для Windows NT (том 2)


Функция Oem2Char (асинхронные операции с файлами)


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

В асинхронном режиме для чтения и записи необходимо подготовить структуры типа OVERLAPPED. Мы делаем это следующим образом:

OVERLAPPED ovRead;

OVERLAPPED ovWrite;

ovRead.Offset = 0;

ovRead.OffsetHigh = 0;

ovRead.hEvent = NULL;

 

ovWrite.Offset = 0;

ovWrite.OffsetHigh = 0;

ovWrite.hEvent = NULL;

Структура ovRead используется для выполнения операций чтения. В поля OffsetHigh и Offset этой структуры мы записываем нулевые значения, поэтому чтение будет выполняться с самого начала файла.

Что же касается поля hEvent, то в него мы записываем значение NULL. При этом мы не будем создавать для синхронизации отдельный объект-событие, а воспользуемся идентификатором файла.

Структура ovWrite, которая предназначена для выполнения операций записи, используется аналогичным образом.

После подготовки структур ovRead и ovWrite функция Oem2Char начинает цикл перекодировки.

Прежде всего, в этом цикле запускается операция асинхронного чтения, для чего вызывается функция ReadFile:

bResult = ReadFile(hSrcFile, cBuf, sizeof(cBuf),

   &dwBytesRead, &ovRead);

В качестве последнего параметра мы передаем этой функции адрес заранее подготовленной структуры ovRead.

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

Далее функция Oem2Char проверяет код возврата фукнции ReadFile. При этом дополнительно вызывается функция GetLastError.

Если при запуске процедуры чтения был достигнут конец файла, эта функция вернет значение ERROR_HANDLE_EOF. В этом случае функция Oem2Char просто возвращает управление.

Если же функция GetLastError вернула значение ERROR_IO_PENDING, то это означает, что в настоящий момент происходит выполнение операции чтения. Приложение может вызвать функцию, например, IdleWork, для выполнения какой-либо фоновой работы.




- Начало -  - Назад -  - Вперед -