Шаг 43.
Операции с файлами. Переименование и усечение файлов

    На этом шаге мы рассмотрим. функции 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>

    На следующем шаге мы рассмотрим получение информации о файле.




Предыдущий шаг Содержание Следующий шаг