Обнаружение конца файла


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

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz