LastError := GetLastError;
if LastError = ERROR_iCOPENDING
then begin if WaitForSingleObject(OverlapRd.hEvent, INFINITE)=wait_OBJECT_0
then
GetOverlappedResult (FHandle, OverlapRd, nb, TRUE) ; end else
raise EAbort.Create (Format ( 'Read failed, error %d' , [LastError] ) ) ;
end;
Result := nb;
CloseHandle(hEvent);
end;
Если вы задали конечный интервал в миллисекундах, а операция еще не закончена, WaitForSingleObject вернет код завершения wait_timeout. Функция GetOverlappedResult возвращает в параметре nb число байтов, действительно прочитанных или записанных во время отложенной операции.
Контроль ошибок ввода/вывода
При работе с файлами разработчик обязательно должен предусмотреть обработку возможных ошибок. Практика показывает, что именно операции ввода/вывода вызывают большую часть ошибок, возникающих в приложении из-за воздействия окружающей программной среды.
Контроль за ошибками ввода/вывода зависит от применяемых функций. При использовании доступа через Win32 API все функции возвращают код ошибки Windows, который и нужно проанализировать.
При возникновении ошибок ввода/вывода в функциях, использующих файловые переменные, генерируется исключительная ситуация класса EInOutError. Но так происходит только в том случае, если включен контроль ошибок ввода/вывода. Для этого используются соответствующие директивы компилятора:
□ {$1+} - контроль включен (установлен по умолчанию);
□ {$!-} - контроль отключен.
Класс EinOutError отличается тем, что у него есть поле ErrorCode. При возникновении этой исключительной ситуации вы можете получить его значение и принять решение. Основные коды имеют такие значения:
О 2- файл не найден;
□ 3 - неверное имя файла;
□ 4 - слишком много открытых файлов;
• 5 - доступ запрещен;
□ 100 - достигнут конец файла;
□ 101 - диск переполнен;
□ 106 - ошибка ввода.
При отключенном контроле в случае возникновения ошибки выполнение программы продолжается без остановки. Однако в этом случае устранение возможных последствий ошибки возлагается на разработчика. Для этого применяется функция
function IOResult: Integer;
которая возвращает значение 0 при отсутствии ошибок.
Атрибуты файла. Поискфайла
Еще одна часто выполняемая с файлом операция - поиск файлов в заданном каталоге. Для организации поиска и отбора файлов используются специальные процедуры, а также структура, в которой сохраняются результаты поиска.
Запись
type
TFileNarae = string; TSearchRec = record
Time: Integer; {Время и дата создания}
Size: Integer; {Размер файла}
Attr: Integer; {Параметры файла}
Name: TFileName; {Полное имя файла}
ExcludeAttr; Integer; {Не используется}
BindHandle: THandle; {Дескриптор файла}
BindData: TWin32FindData;
{Не используется} end;
обеспечивает хранение характеристик файла после удачного поиска. Дата и время создания файла хранятся в формате MS-DOS, поэтому для получения этих параметров в принятом в Delphi формате TDateTime необходимо использовать следующую функцию: