Процедура Close(VAR f) закрывает открытый до этого логический файл f. Попытка закрыть уже закрытый (или еще не открытый) файл вызовет сбой программы. Процедура не изменяет связь между файловой переменной f и физическим файлом, но назначает им текущее состояние «закрыт». Это особенно важно для файлов, открытых для записи. Закрытие файла гарантирует сохранность и полноту заполнения. Так, фатальная ошибка в программе
- 228 -
уже не сможет повлиять на содержимое файла после его закрытия.
Заметим, что если программа прервалась из-за ошибки и до закрытия файла, то он все же будет создан на носителе, но содержимое последнего буфера не будет перенесено в файл. То же самое может случиться и в том случае, если вообще забыть поставить в программу вызовы Close.
Вызовы процедуры Close необходимы при завершении работы с файлами. Также необходимо закрывать открытые файлы перед их удалением (Erase) или переименованием (Rename).
12.5.4. Переименование файлов
Процедура Rename( VAR f; NewName : String ) позволяет переименовать физический файл на диске, связанный с логическим файлом f. Процедура выполнима только с закрытым файлом, в противном случае возникнет сбой.
Предполагается, что файловая переменная f была предварительно связана вызовом процедуры Assign с неким физическим файлом, например FileName. Вызов Rename ( f, NewName ) сменит имя физического файла с FileName на NewName. В принципе, процедура Rename выполняет ту же работу, что и команда REN в MS-DOS. Правда, в отличие от последней Rename не может содержать в строковом параметре символы '*' и '?'.
Рассмотрим фрагмент программы (рис. 12.1).
| VAR
| >f : File of Real;
| BEGIN
| >Assign(f, 'A:\REAL.DAT'); { установлена связь }
| >Rewrite( f ); { открытие файла для записи }
| >Write( f, ... ); { запись в файл f }
| >Close( f ); { обязательно закрытие файла}
| >{Пусть теперь надо сменить имя файла 'REAL' на 'FLOAT'}
| >Rename( f, 'A:\FLOAT.DAT' ); { Готово! }
Рис. 12.1
Переименование происходит при закрытом файле f. После него можно снова открывать файл, но f будет связана уже с новым именем. Старый файл не резервируется (его имя 'A:\REAL.DAT' замещено на 'A:\FLOAT.DAT').
Будет ошибкой так переименовывать имя, что изменится имя диска и путь к файлу. Например, заведомо ошибочен второй оператор:
- 229 -
Assign( f, 'A:\FILE.AAA');
Rename( f, 'C:\FILE.BBB');
поскольку, кроме имени файла, изменяется содержащий его диск. Ведь таким образом мы задаем перенос файла с А: на С:, а лишь затем его переименование. Перенос же, как и копирование, не определен в языке, и его надо конструировать средствами Турбо Паскаля или использовать внешний вызов командного процессора MS-DOS (см. процедуру Exec модуля DOS).