Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 146

12.5.3. Закрытие файлов


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