Обнаружение конца файла
Функция ReadFile проверяет состояние метки конца-файла (eof) для синхронных и асинхронных операций чтения по-разному. Когда синхронная операция чтения достигает конца файла, ReadFile возвращает значение ИСТИНА (TRUE) и устанавливает переменную, на которую указывает параметр lpNumberOfBytesRead, в нуль. Асинхронная операция чтения может столкнуться с концом файла в ходе инициализации вызова ReadFile или в ходе последующей асинхронной операции.
В примере ниже делаем проверку конца файла в ходе синхронной операции чтения.
// Побробуем сделать синхронную операцию чтения
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, NULL);
// Проверка eof (метки конца файла)
if (bResult && nBytesRead == 0, )
{
// В конце файла
}
|
Проверка метки конца файла в ходе асинхронной операции чтения - более трудная. Для асинхронных операций чтения имеется три индикатора конца файла:
Пример ниже показывает, как обнаружить метку конца файла в ходе асинхронной операции чтения:
// Попытаемся инициализировать асинхронную операцию чтения.
bResult = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, &gOverlapped);
// Проверим, были ли проблемы.
if (!bResult)
{
switch (dwError = GetLastError())
{
case ERROR_HANDLE_EOF:
// В конце файла.
break;
case ERROR_IO_PENDING:
// Задержка ввода - вывода.
break;
}
}
// Проверим асинхронную операцию чтения.
bResult = GetOverlappedResult(hFile, &gOverlapped, &nBytesRead, TRUE);
// Проверим, были ли проблемы.
if (!bResult)
{
switch (dwError = GetLastError())
{
case ERROR_HANDLE_EOF:
// В конце файла
}
} |