Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Файлы.doc
Скачиваний:
5
Добавлен:
12.11.2019
Размер:
517.12 Кб
Скачать

Работа с файловой системой

Для эффективного управления расположением файлов в Turbo Pascal предусмотрено множество процедур. Те операции, которые не входят в стандартную поставку Turbo Pascal, можно реализовать самостоятельно.

8.9.1. Удаление файлов

Удаление файлов с диска производится процедурой Erase (англ. Erase – стирать), имеющий следующий вид: Erase(<файловая переменная>);

Перед удалением фаил, определяемый параметром файловая переменная, не должен открыт для чтения или записи. Соответственно, после удаления фаил не следует закрывать, так как он не был открыт. Правило сопоставления фаиловых переменных фаила при использования процедуры Erase остаются такими же , как и для обычной работы с файлами, то есть в процедуре Assign можно использовать либо полные имена файлов, либо относительные.

8.9.2. Переименование и перенос файлов

Переименование и перенос файлов на диске производится процедурой Rename (англ. Rename – переименовать), имеющей следующий вид: Rename(<файловая переменная>, <новое имя файла>);

В качестве параметра Новое имя файла используется строковая переменная или константа, содержащая новое имя файла, при этом возможно смена каталога, в котором находился файл, в результате чего и осуществляется не просто переименование файла, а его перенос. Изменять положение файла таким образом, чтобы он оказался на другом логическом диске, не допускается.

8.9.3. Копирование файлов

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

Напишем процедуру, которая должна:

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

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

Использование процедуры продемонстрируем на примере программы, создающей текстовый файл и перемещающей его в корневой католог дискеты (см. листинг 213).

Листинг 213. создание и перемещение файла

Program createandcopy;

Uses crt;

Var t: text;

{описание глобальной файловой переменной для создания текстового файла, который в дальнейшем будет перенесен на дискету}

Procedure movefile (SourceName, DestName: string; move: Boolean);

{заголовок процедуры movefile для переноса или переименования файла, параметры SourceName и DestName указывают имена исходного и результирующего файлов, параметр Move – необходимость удаления исходного файла после создания его копии}

Var

Source, Dest: File;

tmpByte: Byte;

begin

Assign (Source, SourceName);

Assign(Dest, DestName);

Reset(Source,1);

ReWrite(Dest,1);

While not EOF(Source) Do

Begin

BlockRead(Source, tmpByte,1);

BlockWrite(Dest, tmpByte,1);

End;

Close (Source);

Close (Dest);

If Move then Erase(Source); {Если в качестве параметра Move передано true, то удаление исходного файла, в результате чего происходиьт не копирование файла, а перенос (или переименование, если результирующий файл находится в одном каталоге с исходным)

End;

Begin

Assign(t, ‘ForMove.txt’); {Сопоставление глобальной переменной t файлу с именем ForMove.txt}

Rewrite(t); {Создание файла ForMove.txt в текущем каталоге}

Write(t, ‘Этот файл будет перемещен’); {Запись строки в файл ForMove.txt}

Close(t);

MoveFile(‘ForMove.txt’, ‘a:\Moved.txt’, True); {Перенос файла ForMove.txt yна дискету}

End.

Работа с каталогами

Для более удобной организации файлов, используемых программой, используются каталоги. Например, если программа работает с множеством изображений, их можно хранить в каталоге с названием Pictures, текстовые файлы можно хранить в каталоге Texts, и так далее. Основные операции с каталогами состоят в их создании с какими-либо именами в каком-либо месте файловой структуры и переименовании. Также интересна операция изменения текущего каталога, из которого читаются и в который записываются файлы с относительными именами (не включающими название логического диска и полный путь).

Создание каталога

Создание каталогов на диске производится оператором MkDir (англ. Make Directory – создать каталог), имеющим следующий вид: MkDir (<Имя каталога>);

Параметр Имя каталога является строковой переменной или константой, содержащий название каталога по правилам, аналогичным именам файлов. Если задается полное название каталога, то он появляется на диске. Возможно задание относительного названия каталога. При попытке создания уже существующего каталога информация в нем не стирается, а выдается ошибка времени выполнения программы Error 5: File access denied – Ошибка 5: Запрещен доступ к файлу.

Удаление каталога

Удаление каталогов на диске производится оператором RmDir (англ. Remove Directory – удалить каталог), имеющим следующий вид: RmDir (<Имя каталога>);

Удаление возможно только для каталогов, которые не содержат файлов или подкаталогов.

Переименование каталога

Специальной процедурой для переименования каталогов не существует, однако можно написать свою процедуру для переименования каталога, состоящую из двух частей:

  1. Удаление каталога.

  2. Создание каталога с новым именем.

Изменение текущего каталога

Для изменения текущего каталога – каталога, относительно которого рассматриваются относительные имена файлов и каталогов – используется процедура ChDir (англ. Change Directory – изменить каталог): ChDir (<Имя каталога>);

Одной из часто решаемых задач при работе с файловой системой является поиск файлов. В Turbo Pascal для этого предназначена пара функций FindFirst (от англ. Find First ­ найти первый) и FindNext (англ. Find Next – найти следующий), находящиеся в стандартном модуле WinDos.

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

Например, текущим является каталог C:\MyProgs, содержащий следующие файлы: 1.txt, 2.txt, 12.txt, 2.pas, 3.pas, 34.pas.

Тогда маске *.* соответствуют все файлы, так как она задаёт любое сочетание символов в имени и любое сочетание символов в расширении. Маске 1*.* соответствуют файлы 1.txt и 12.txt как начинающиеся с символа 1, имеют любое сочетание символов после него и любое расширение. Маске 1?.* соответствует только один файл – 12.txt, как состоящий из двух символов – 1 и любого другого. Соответственно, маске *.zzz не соответствует ни одного файла, так как файлов с таким расширением в каталоге нет.

Сканирование каталога происходит следующим образом:

  1. Процедура FindFirst ищет первый файл, имя которого соответствует маске: FindFirst (<Маска>, <Флаги поиска>, <Приёмник информации о найденном файле>);

Параметр Маска является строковой переменной или константой и задаёт маску, которой должны соответствовать имена найденных файлов.

Параметр Флаги поиска определяет типы файлов, которые рассматриваются при поиске и являются набором специальных констант, объединённых бинарным оператором OR: Флаги поиска файлов

Флаг

Тип файла

faReadOnly

Искать файлы с атрибутом «Только для чтения»

FaHidden

Искать файлы с атрибутом «Скрытый»

faSysFile

Искать файлы с атрибутом «Системный»

faVolumeld

Возвращать идентификатор носителя

faDirectory

Возвращать информацию о найденных каталогах

faArchive

Искать файлы с атрибутом «Архивный»

faAnyFile

Искать файлы с атрибутом

Параметр Приемник информации о найденном файле представляет собой переменную сложного типа TsearchRec, описанную в модуле WinDos следующим образом:

Type TsearchRec = Record {заголовок описания типа данных} Fill: Array [1..21] Of Byte; {зарезервировано и не используется} Attr: Byte; {атрибуты найденного файла (см. табл. 5)} Time: Longint; {время создания файла} Size: Longint; {размер файла} Name: Array [0..12] Of Char; {имя найденного файла} end;

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

  2. Процедура FindNext ищет следующий файл, соответствующий условиям поиска, заданным при последнем вызове процедуры FindFirst:

FindNext(<приемник информации о найденном файле>);

В качестве примера поиска файлов напишем программу, осуществляющую поиск файлов в текущем каталоге, имеющих расширение pas и вычисление их суммарного размера.

Пример . Поиск файлов по маске

Program Find;

Uses crt, WinDos;

Var

Found: TSerchRec;

AllSize: Word;

Begin

ClrScr;

AllSize:=0; {Обнуление суммарного объема файлов}

FindFirst(‘*.pas’, faAnyFile, Found); {Поиск первого файла, имя котороно соответствует массе *.pas (любое собственное имя файла и расширение pas), рассматриваются все файлы, результат поиска помещается в переменную Found}

While DosError = 0 do {Пока переменная DosError, содержащая результат поиска, имеет нулевое значение (т.е. последняя операция поиска проведена успешно), продолжать поиск очередных файлов, соответствующих заданным условиям}

Begin

Writeln(Fount.Name); {Вывод имени файла, найденного последней процедурой поиска}

AllSize:=AllSize + Found.Size; {Увеличение значения переменной, содержащей суммарный объем файлов, на размер файла, найденного в последний раз}

FindNext(Found); {Поиск следующего файла с теми же параметрами и помещение результатов поиска в переменную Found}

End;

Writeln(AllSize); {Вывод суммарного объема файлов на экран}

End.