На этом шаге мы рассмотрим операции с каталогами.
Как мы отмечали ранее, в UNIX каталоги являются файлами специального формата, помеченными в структурах своих индексных дескрипторов как каталоги (поле rdev). Содержимым блоков данных каталогов является множество пар, состоящих из объекта, содержащегося в каталоге, и числового значения его индексного дескриптора.
Для работы с каталогами в Perl предусмотрены функции открытия, закрытия и чтения содержимого каталога, синтаксис и семантика которых аналогичны синтаксису и семантики соответствующих операций с файлами:
opendir ДЕСКРИПТОР, ИМЯ_КАТАЛОГА; closedir ДЕСКРИПТОР; readdir ДЕСКРИПТОР;
Доступ к содержимому каталога осуществляется, как и в случае с файлом, через создаваемый функцией opendir() дескриптор каталога. Отметим, что для дескрипторов каталогов в таблице символов Perl создается собственное пространство имен. Это означает, что в программе могут существовать, совершенно не конфликтуя между собой, дескрипторы файла и каталога с одинаковыми именами:
open FF, "/usr/out.dat" # Дескриптор файла. opendir FF, "/usr" # Дескриптор каталога.
Функция readdir() для открытого каталога в списковом контексте возвращает список имен всех файлов каталога или пустой список, если все имена уже были прочитаны. Эта же функция в скалярном контексте возвращает следующее имя файла каталога или неопределенное значение undef, если были прочитаны все имена файлов.
Функцией rewinddir() текущая позиция в каталоге устанавливается на начало, что позволяет осуществлять повторное чтение имен файлов каталога, не закрывая его. Единственным параметром этой функции является дескриптор открытого каталога.
Программа следующего примера проверяет, являются все файлы каталога двоичными (содержимое вложенных каталогов не проверяется).
#! perl -w opendir FDIR, "/usr/prog"; while ( $name = readdir FDIR) { next if -d $name; # Каталог. print("$name: двоичный\n") if -B $name; # Двоичный файл. } closedir FDIR;
Функция readdir() возвращает относительное имя файла. Для получения полного имени файла следует создать его в программе самостоятельно. Например, добавить имя проверяемого каталога в примере:
print("/usr/prog/$name: двоичный\n") if -В $name; # Двоичный файл.
Для создания нового каталога следует воспользоваться функцией mkdir(), параметрами которой являются имя каталога и режим доступа (восьмеричное число):
mkdir ИМЯ_КАТАЛОГА, РЕЖИМ;
Если задается не полное имя каталога, то он создается в текущем каталоге, устанавливаемом функцией chdir(). Возвращаемым значением функции создания нового каталога mkdir() является Истина, если каталог создан, и Ложь, если произошла какая-то ошибка. В последнем случае в специальной переменной $! хранится объяснение не выполнения операции создания каталога.
Удалить каталог можно функцией rmdir() с параметром, содержащим строку с именем каталога. Если параметр не задан, то используется специальная переменная $_. Как и функция создания каталога, эта функция возвращает значение Истина в случае успешного удаления каталога и Ложь в противном случае, записывая в переменную $! объяснение возникшей ошибки.
На следующем шаге мы приведем несколько примеров, иллюстрирующих применение изученного материала.