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




Для эффективного управления расположением файлов в 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;

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

3. Процедура 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.

 

Обобщение систематизация. Контрольные вопросы и ответы

1. Что представляет собой файл?

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

2. Какие бывают файлы?

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

3. Какие процедуры в Pascal используются для операций открытия и закрытия файла?

Перед использованием файлов для чтения или записи их необходимо открыть с помощью процедур Reset – для чтения, ReWrite – для записи, Append – для дозаписи. После файл необходимо закрыть с помощью процедуры Close.

4. Какие процедуры используются для чтения информации из файлов разных типов?

Для чтения информации из текстовых файлов используются процедуры Read и Readln, для двоичных типизированных – процедура Read, для двоичных нетипизированных – процедура BlockRead.

5. Какие процедуры используются для записи информации в файлы разных типов?

Для текстовых файлов используются процедуры Write и Writeln, для двоичных типизированных – Write, для двоичных нетипизированных файлов – процедура BlockWrite.

6. Какие процедуры предусмотрены в Pascal для операций с каталогами?

Для организации удобной иерархической структуры файлов используются каталоги файловой системы. Операции, выполняемые с каталогами, включают их создание (процедура MkDir), удаление (процедура RmDir), и изменение текущего каталога – каталога, относительно которого указываются пути к файлам, имя которых задано не полностью.



Поделиться:




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

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-05-16 Нарушение авторских прав и Нарушение персональных данных


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