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


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


Перед тем как продолжить свою работу, функция дожидается завершение операции чтения, вызывая для этого функцию WaitForSingleObject, описанную в предыдущем томе “Библиотеки системного программиста”:

WaitForSingleObject(hSrcFile, INFINITE);

При этом главная задача приложения перейдет в состояние ожидания до тех пор, пока не закончится операция чтения. Напомним, что в состоянии ожидания задача не отнимает циклы процессорного времени и не снижает производительность системы.

Далее функция проверяет результат выполнения асинхронной операции чтения, вызывая функцию GetOverlappedResult:

bResult = GetOverlappedResult(hSrcFile, &ovRead,

  &dwBytesRead, FALSE);

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

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

Вслед за этим в структуре ovRead изменяется содержимое поля Offset:

ovRead.Offset += dwBytesRead;

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

Асинхронная операция записи прочитанных данных запускается при помощи функции WriteFile:

bResult = WriteFile(hDstFile, cBuf, dwBytesRead,

  &dwBytesWritten, &ovWrite);

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

После анализа кода возврата функции WriteFile вызывается функция GetOverlappedResult, с помощью которой определяется результат завершения операции записи:

GetOverlappedResult(hDstFile, &ovWrite,

  &dwBytesWritten, TRUE);

Так как через последний параметр этой функции передается значение TRUE, функция GetOverlappedResult выполняет ожидание завершения операции записи. Кроме того, в локальную переменную dwBytesWritten эта функция заносит количество байт данных, записанных в выходной файл.

Так как асинхронные операци чтения и записи не изменяют текущую позицию в файле, после выполнения записи мы изменяем соответствующим образом содержимое поля Offset в структуре ovWrite:

ovWrite.Offset += dwBytesWritten;

Далее цикл перекодировки продолжает свою работу.




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