Обнаружение конца файла
Функция 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: // В конце файла } } |