Шаг 42.
Операции с файлами. Жесткие и символические ссылки

    На этом шаге мы рассмотрим создание и использование ссылок различного вида на файл.

    Файловая система UNIX позволяет создавать ссылки на один и тот же файл. Это реализуется простым указанием одного и того же индексного дескриптора для двух элементов каталога. Такие ссылки называются жесткими (hard) ссылками, и операционная система не различает элемент каталога, созданный при создании файла, и ссылок на этот файл. При обращении к файлу по ссылке и по имени изменяются поля индексного дескриптора. Физически файл уничтожается только тогда, когда уничтожается последняя жесткая ссылка на файл.

    В UNIX существует еще один тип ссылок на файл - символические ссылки. Эти ссылки отличаются от жестких тем, что они косвенно ссылаются на файл, имя которого хранится в блоке данных символической ссылки.

    Жесткие ссылки создаются в Perl функцией link(), а символические - функцией symlink(). Синтаксис этих функций одинаков - их два параметра представляют имя файла, для которого создается ссылка, и новое имя файла-ссылки:

    link   СТАРЫЙ_ФАЙЛ, НОВЫЙ_ФАЙЛ; 
    symlink СТАРЫЙ_ФАЙЛ, НОВЫЙ_ФАЙЛ;

    При успешном создании жесткой ссылки функция link() возвращает Истина, иначе Ложь. Создание символической ссылки функцией symlink() сопровождается возвратом ею числа 1 в случае успешного выполнения операции и 0 в противном случае.


    Замечание. В версиях Perl для DOS эти функции не реализованы, и при попытке их вызова интерпретатор выдает фатальную ошибку:
    The Unsupported function link function is unimplemented at D:\EX2.PL line 2.
    The symlink function is unimplemented at D:\EX2.PL line 2.

    Удалить существующие ссылки на файл можно функцией unlink(). Эта функция удаляет одну ссылку на каждый файл, заданный в списке ее параметров. Если ссылок на файл не существует, то удаляется сам файл. Функция возвращает количество файлов, для которых успешно прошла операция удаления. Вызов функции unlink() без списка параметров использует содержимое специальной переменной $_ в качестве списка параметров. Следующий фрагмент кода удаляет все резервные копии файлов текущего каталога:

    unlink <*.bak>;

    В структуре индексного дескриптора поле nlink содержит количество жестких ссылок на файл. Его можно использовать совместно с функцией unlink() для удаления всех ссылок на файл. Если ссылок нет, то это поле имеет значение 1 (только имя файла, определенное при его создании, ссылается на индексный дескриптор файла).


    Замечание. Каталоги в UNIX являются файлами специального вида. Однако их нельзя удалить функцией unlink, если только вы не суперпользователь или при запуске Perl не используется флаг -U. Для удаления каталогов рекомендуется использовать функцию rmdir().

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




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