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


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


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

void Oem2Char(HANDLE hSrcFile, HANDLE hDstFile)

{

  DWORD dwBytesRead;

  DWORD dwBytesWritten;

  BOOL  bResult;

 

  while(TRUE)

  {

    bResult = ReadFile(hSrcFile, cBuf, 2048,

      &dwBytesRead, NULL);

    if(bResult && dwBytesRead == 0)

      break;

 

    if(fConversionType == OEM_TO_ANSI)

      OemToCharBuff(cBuf, cBuf, dwBytesRead);

    else if(fConversionType == ANSI_TO_OEM)

      CharToOemBuff(cBuf, cBuf, dwBytesRead);

 

    WriteFile(hDstFile, cBuf, dwBytesRead,

      &dwBytesWritten, NULL);

  }

}

Здесь мы работаем с файлом обычным образом.

Перекодировка файла выполняется в цикле, который прерывается при достижении конца исходного файла.

Функция Oem2Char при помощи функции ReadFile читает фрагмент исходного файла в буфер cBuf, расположенный в области глобальных переменных. Количество прочитанных байт записывается при этом в локальную переменную dwBytesRead.

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

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

На следующем этапе преобразованное содержимое буфера cBuf записывается в выходной файл при помощи функции WriteFile. При этом количество действительно записанных байт сохраняется в локальной переменной dwBytesWritten, однако в нашем приложении оно никак не используется.

Сделаем важное замечание относительно функций OemToCharBuff и CharToOemBuff.




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