Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
конспект лекций_2 семестр.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1.4 Mб
Скачать

Контроль ошибок ввода/вывода

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

ввода/вывода. Для этого используются соответствующие директивы компилятора:

{$!+}контроль включен (установлен по умолчанию); {$!-}—контроль отключен.

Класс EinOutError отличается тем, что у него есть поле ErrorCode. При возникновении этой исключительной ситуации вы можете получить его значение и принять решение. Основные коды имеют такие значения: 2- файл не найден; 3 — неверное имя файла; 4 — слишком много открытых файлов; 5 — доступ запрещен; 100 — достигнут конец файла; 101 — диск переполнен; 106 — ошибка ввода.

При отключенном контроле в случае возникновения ошибки выполнение программы продолжается без остановки. Однако в этом случае устранение возможных последствий ошибки возлагается на разработчика. Для этого применяется функция function IOResult: Integer; которая возвращает значение 0 при отсутствии ошибок.

Атрибуты файла. Поиск файла

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

Запись

type

TFileName = string;

TSearchRec = record

Time: Integer; {Время и дата создания}

Size: Integer; {Размер файла}

Attr: Integer; {Параметры файла}

Name: TFileName; {Полное имя файла}

ExcludeAttr: Integer; {He используется}

FindHandle: THandle; {Дескриптор файла}

FindData: TWin32FindData; {He используется}

end;

обеспечивает хранение характеристик файла после удачного поиска. Дата и время создания файла хранятся в формате MS-DOS, поэтому для получения этих параметров в принятом в Delphi формате TDateTime необходимо использовать следующую функцию:

function FileDateToDateTime(FileDate: Integer): TDateTime;

Обратное преобразование выполняет функция

function DateTimeToFileDate(DateTime: TDateTime): Integer;

Свойство Attr может содержать комбинацию следующих флагов-значений:

  • faReadOniy — только для чтения;

  • faDirectory — каталог;

  • faHidden — скрытый;

  • faArchive — архивный;

  • faSysFile — Системный;

  • faAnyFile — Любой.

  • faVoiumeio — метка тома;

Для определения параметров файла используется оператор AND:

if (SearchRec.Attr AND faReadOniy) > 0 then ShowMessage('Файл только для чтения');

Непосредственно для поиска файлов используются функции FindFirst и FindNext.

Функция function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

находит первый файл, заданный полным маршрутом Path и параметрами Attr. Если заданный файл найден, функция возвращает 0, иначе — код ошибки Windows. Параметры найденного файла возвращаются в записи F типа TSearchRec.

Функция function FindNext(var F: TSearchRec): Integer;

применяется для повторного поиска следующего файла, удовлетворяющего критерию поиска. При этом используются те параметры поиска, которые заданы последним вызовом функции FindFirst. В случае удачного поиска возвращается 0.

Для освобождения ресурсов, выделенных для выполнения поиска, применяется функция:

procedure FindClose(var F: TSearchRec);

В качестве примера организации поиска файлов рассмотрим фрагмент исходного кода, в котором маршрут поиска файлов задается в однострочном текстовом редакторе DirEdit, а список найденных файлов передается в компонент TListBox.

procedure TForml.FindBtnClick(Sender: TObject);

begin

ListBox.Items.Clear;

FindFirst(DirEdit.Text, faArchive + faHidden, SearchRec);

while FindNext(SearchRec) = 0 do

ListBox.Items.Add(SearchRec.Name);

FindClose(SearchRec);

end;

Потоки

Потоки — очень удачное средство для унификации ввода/вывода для различных носителей. Потоки представляют собой специальные объекты наследники абстрактного класса Tstream. Сам Tstream "умеет" открываться, читать, писать, изменять текущее положение и закрываться. Поскольку для разных носителей эти вещи происходят по-разному, конкретные аспекты реализованы в его потомках. Наиболее часто используются потоки для работы с файлами на диске и памятью. Многие классы VCL имеют унифицированные методы LoadFromStream и saveTostream, которые обеспечивают обмен данными с потоками. От того, с каким физическим носителем работает поток, зависит место хранения данных.