На этом шаге мы рассмотрим. функции rename() и truncate().
Две последние операции, связанные с файлами, - это переименование и усечение файла. Функция rename() меняет имя файла, заданного первым параметром, на имя, определяемое вторым параметром этой функции:
rename "old.dat", "new.dat";
Этот оператор переименует файл old.dat в файл new.dat. Функция переименования файла возвращает 1 при успешном выполнении этой операции и 0 в противном случае.
Функция truncate() усекает файл до заданной длины. Для задания файла можно использовать как имя файла, так и дескриптор открытого файла:
truncate ДЕСКРИПТОР, ДЛИНА; truncate ИМЯ_ФАЙЛА, ДЛИНА;
Функция возвращает значение Истина, если длина файла успешно усечена до количества байт, определенных в параметре ДЛИНА, или неопределенное значение undef в противном случае. Под усечением файла понимается не только уменьшение его длины, но и увеличение. Это означает, что значение второго параметра функции truncate() может быть больше истинной длины файла, что позволяет делать "дыры" в содержимом файла, которые в дальнейшем можно использовать для записи необходимой информации, не уничтожая уже записанную в файл:
#! perl -w # Создание файла с "дырами". for($i=1;$i<=3;$i++) { open(F, ">>out.dat") or die $!; print F "Запись".$i; close F; open(F, ">>out.dat") or die $!; truncate F, 19*$i; close F; } # Запись информации в "дыры". open(F, "+<out.dat") or die $!; for($i=1;$i<=3;$i++) { seek F, 0, 1; read F, $recl, 7; seek F, 0, 1; print F "<CONTENTS:".$i.">"; } close F;
На каждом шаге первого цикла for примера в конец файла out.dat записывается информация длиной 7 байтов, а потом его длина увеличивается на 12 байтов, образуя пустое пространство в файле. Следующий цикл for заносит в эти созданные "дыры" информацию длиной 12 байтов, не затирая хранящуюся в файле информацию. Обратите внимание, что для изменения длины файла функцией truncate приходится закрывать его и снова открывать. Это связано с тем обстоятельством, что функция truncate() добавляет пустое пространство в начало файла, сдвигая в конец его содержимое, если применять ее, не закрывая файл. Можете поэкспериментировать с программой примера, открыв файл перед выполнением первого цикла for, и закрыв его после завершения цикла. Содержимое файла даст вам наглядное представление о работе функции truncate в этом случае. У нас же после выполнения первого цикла for содержимое файла out.dat выглядит так:
Запись1 Запись2 Запись3
По завершении всей программы файл будет содержать следующую строку:
Запись1<CONTENTS:1>Запись2<CONTENTS:2>Запись3<CONTENTS:3>
На следующем шаге мы рассмотрим получение информации о файле.