|
|||||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Подпрограммы для работы с файламиНиже описываются процедуры и функции, которые часто используются с файлами любого вида (таблица). Таблица. Подпрограммы для работы с файлами
Подпрограммы FindFirst, FindNext и FindClose позволяют получить доступ к группе файлов, объединенных общими признаками. Эти признаки при обращении к функции FindFirst указываются маской выбора файлов и их атрибутами. При формировании маски выбора файлов могут использоваться следующие символы-заменители: * – означает, что на месте этого символа может стоять сколько угодно (в том числе ноль) разрешенных символов имени или расширения файла; ? – означает, что на месте этого символа может стоять один из разрешенных символов. Например: *. * – все файлы из каталога; с*. * – все файлы с именами, начинающимися на с (cl.pas, ccl2345.c.dat и т. д.); а?. dat – имена файлов типа a0.dat, az.dat и т. д. Маске выбора может предшествовать маршрут поиска файлов. Например, команда может выглядеть так С:\Dir\SubDir\*.pas Эта команда означает выбор всех файлов с расширением PAS из каталога SubDir, находящегося на диске С; каталог SubDir зарегистрирован в каталоге верхнего уровня Dir, который, в свою очередь, входит в корневой каталог. Если маршрут не указан, файлы ищутся в текущем каталоге. Параметр Attr при обращении к FindFirst содержит двоичные разряды (биты), уточняющие, к каким именно файлам разрешен доступ. Вот как объявляются файловые атрибуты в модуле SysUtils: Const faReadOnly = $01; // Только чтение faHidden = $02; // Скрытый файл faSysFile = $04; // Системный файл faVolumeID = $08; // Идентификатор тома faDirectory = $10; // Имя вложенного каталога faArchive = $20; // Архивный файл faAnyFile = $3F; // Любой файл Комбинацией битов в этом байте можно указывать самые разные варианты, например $06 – выбор всех скрытых и/или системных файлов. Результат работы процедуры FindFirst возвращается в переменной типа TSearchRec. Этот тип определяется следующим образом: Type TSearchRec = record Time: Integer; Size: Integer; Attr: Integer; Name: TFileName; ExcludeAttr: Integer; FindHandle: THandle; FindDate: Twin32FindDate; end; Здесь Attr – атрибуты файла; Time – время и дата создания или последнего обновления файла в системном формате; Size – длина файла в байтах; Name – имя и расширение файла; FindDate – переменная с дополнительной информацией о файле (время создания, время последнего доступа). Результат обращения к процедуре FindFist возвращается в значении типа Integer, которое равно 0, если нет ошибок. Следующая программа иллюстрирует способ использования функций FindFirst и FindNext. Программа выводит в окно многострочного текстового поля mmOutput список всех файлов, маска выбора которых (и, возможно, маршрут поиска) указана в поле edInput: procedure TfmExample.bbRunClick(Sender: TObject); Var Mask: String; SR: TSearchRec; Begin Mask:= edlnput.Text; if Mask = ' ' then Mask:= '*.*'; mmOutput.Lines.Clear; if FindFirst(Mask,faAnyFile,SR)=0 then Repeat mmOutput.Lines.Add(SR.Name); until FindNext (SR) <>0; FindClose(SR); end; Любое обращение к файлу в Delphi осуществляется через некоторый буфер, что необходимо для согласования внутреннего представления файлового компонента (записи) с принятым в операционной системе форматом хранения данных на диске. В ходе выполнения процедуры Flush все новые записи будут действительно записаны на диск. Процедура игнорируется, если файл был инициализирован для чтения процедурой Reset. В Delphi для защиты программы от краха при выполнении потенциально опасных фрагментов широко используется механизм обработки исключительных ситуаций. В следующем фрагменте показано, как можно использовать этот механизм при работе с файлами. Предположим, что требуется отредактировать файл, имя которого содержит переменная Name. Перед редактированием необходимо убедиться, что нужный файл имеется на диске, и создать его страховочную копию с расширением ВАК. Если одноименный файл (то есть с таким же именем и расширением ВАК) уже существует, его надо уничтожить. Var Fi: TextFile; // Исходный файл Fo: TextFile; // Отредактированный файл Name: String; // Имя исходного файла Name_bak: String; // Имя страховочного файла Const ВАК = '.bak'; Begin … // Получаем в name_bak имя файла с расширением.ВАК: Name_bak:= copy(Name, 1, pos ('.', Name)) + ВАК; // Проверяем существование исходного файла: AssignFile(Fi, Name); Try Reset(Fi); Except Halt; // Завершаем программу: файла не существует end; CloseFile(Fi); // Проверяем существование ВАК-файла: AssignFile(Fo, Name_bak); Try Reset(Fo); // ВАК-файл существует: CloseFile(Fo); // Закрываем его Erase(Fo) // и уничтожаем Finaly // Файл не существует: ничего не делаем end; // Проверки закончены, подготовка к работе: Rename(Fi, Name_bak); Reset(Fi); AssignFile(Fo, Name); Rewrite(Fo); … end. Проверка на существование ВАК-файла в данном примере необходима, так как следующее обращение вызовет ошибку в случае, если такой файл существует: Rename(Fi, Name_bak); Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.008 сек.) |