АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Подпрограммы для работы с файлами

Читайте также:
  1. File — единственный объект в java.io, который работает непосредственно с дисковыми файлами.
  2. I. Организация выполнения выпускной квалификационной работы
  3. II. Порядок подготовки, защиты и оценки квалификационной работы
  4. II. Работы учеников Уильяма Джеймса: Дж. Дьюи, С. Холла, Дж. Кэттела, Э. Торндайка
  5. II. Рекомендации по оформлению контрольной работы.
  6. II. Требования охраны труда перед началом работы.
  7. II. Требования охраны труда перед началом работы.
  8. II. Требования охраны труда перед началом работы.
  9. III. Истоки психологии в России: работы И.М. Сеченова
  10. III. Общие методические указания по выполнению курсовой работы
  11. III. Требования охраны труда во время работы
  12. III. Требования охраны труда во время работы

Ниже описываются процедуры и функции, которые часто используются с фай­лами любого вида (таблица).

Таблица. Подпрограммы для работы с файлами

procedure AssignFile (var F; FileName: String); Связывает файловую переменную F с именем файла FileName
    procedure CloseFile (var F); Закрывает файл, однако связь файловой переменной F с именем файла, установленная ранее процедурой AssignFile, сохраняется. При создании нового или расширении старого файла процедура обеспечивает сохранение в файле всех новых записей и регистрацию файла в каталоге. Процедура CloseFile выполняется автоматически по отношению ко всем открытым файлам при нормальном завершении программы. Поскольку связь файла с файловой переменной сохраняется, файл можно повторно открыть без дополнительного использования процедуры AssignFile
  functionEOF(var F): Boolean; Тестирует конец файла и возвращает True, если файловый указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конец файла, при чтении – что файл исчерпан
    procedure Erase(var F); Уничтожает файл F. Перед выполнением процедуры необходимо закрыть файл. В ряде случаев вместо процедуры Erase удобнее использовать функцию DeleteFile, которая не требует предварительного связывания имени файла с файловой переменной.
function FileExists(const FileName: String): Boolean; Возвращает True, если файл с именем (и, возможно, маршрутом доступа) FileName существует
  function FindFirst (const Path: String; Attr: Integer; var F: TSearchRec): Integer; Возвращает атрибуты первого из файлов, зарегистрированных в указанном каталоге: Path – маршрут поиска и маска выбора файлов; Attr – атрибуты выбираемых файлов; F – переменная типа TSesrchRec, в которой будет возвращено имя первого выбранного файла. При успешном поиске возвращает значение 0
procedure FindClose(var F: TSearchRec); Освобождает память, выделенную для поиска файлов функциями FindFirst и FindNext
procedure Flush(var F); Очищает внутренний буфер файла и, таким образом, гарантирует сохранность всех последних изменений файла на диске
  procedure GetDir(D: Byte; var S: String); Возвращает имя текущего каталога (каталога по умолчанию): D – номер устройства (0 – устройство по умолчанию, 1 – диск А, 2 – диск В и т. д.); S – переменная типа String, в которой возвращается путь к текущему каталогу на указанном диске
procedure MkDir(Dir: String); Создает новый каталог на указанном диске: Dir – маршрут поиска каталога. Последним именем в маршруте, то есть именем вновь создаваемого каталога, не может быть имя уже существующего каталога
procedure Rename (var F; NewName: String); Переименовывает файл F; NewName – строковое выражение, содержащее новое имя файла. Перед выполнением процедуры необходимо закрыть файл
procedure Reset (var F: File [; RecSize: Word]); Открывает существующий файл. RecSize имеет смысл только для нетипизированных файлов и определяет размер блока данных
procedure Rewrite (var F: File [; Recsize: Word]); Создает новый файл. RecSize имеет смысл только для нетипизированных файлов и определяет размер блока данных
procedure RmDir(Dir: String); Удаляет каталог Dir. Удаляемый каталог должен быть пустым, то есть не содержать файлов или имен каталогов нижнего уровня

Подпрограммы 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);


1 | 2 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.008 сек.)