Изучаем Perl - Шварц Р.
Скачать (прямая ссылка):


177
Создание и удаление каталогов
Вы не смогли бы выполнить указанные операции (во всяком случае, в UNIX-
системе), не зная о команде mkdir( 1), которая создает каталоги,
содержащие файлы и другие каталоги. В Perl есть эквивалент этой команды -
функция mkdir, которая в качестве аргументов принимает имя нового
каталога и некое число, определяющее права доступа к созданному каталогу.
Права доступа задаются как число, интерпретируемое во внутреннем формате
прав доступа. Если вы не знакомы с внутренним форматом прав доступа,
обратитесь к man-странице chmod(2). Если вам некогда с этим разбираться,
просто укажите права доступа как 0777, и все будет нормально*. Вот пример
создания каталога с именем gravelpit:
mkdir{"gravelpit",0777) || die "cannot mkdir gravelpit: $!";
UNIX-команда rmdir( 1) удаляет пустые каталоги. В Perl есть ее эквивалент
с тем же именем. Вот как можно сделать Фреда безработным:
rmdir("gravelpit") I i die "cannot rmdir gravelpit: $!";
Хотя эти Perl-операции используют преимущества системных вызовов с такими
же именами, они будут выполняться (хотя и чуточку медленнее) даже в
системах, не поддерживающих такие вызовы. Perl вызывает утилиты mkdir и
rmdir (или как там они называются у вас в системе) автоматически.
Изменение прав доступа
Права доступа к файлу или каталогу определяют, кто (в широком смысле
слова) и что может делать с этим файлом или каталогом. В UNIX
общепринятый метод изменения прав доступа к файлу - применение команды
chmod(l). (Если вы не знакомы с этой операцией, обратитесь к ее шап-стра-
нице.) В Perl права доступа изменяются с помощью функции chmod. Эта
функция получает в качестве аргументов заданный восьмеричным числом режим
доступа и список имен файлов и пытается изменить права доступа ко всем
этим файлам в соответствии с указанным режимом. Чтобы сделать файлы fred
и barney доступными в режимах чтения и записи для всех пользователей,
нужно выполнить такую операцию:
chmod(0 6 66,"fred","barney");
Режим 06 6 6 обозначает чтение и запись для владельца, группы и прочих
пользователей, т.е. как раз то, что нам нужно.
В данном случае вы не создаете каталог с самыми широкими правами доступа.
Определить права доступа вам также поможет текущая маска доступа umask
вашего процесса. В UNIX-системах см. описание команды shell umask или
man-страницу umask(2).
178
Изучаем PERL
Функция chmod возвращает число файлов, для которых были успешно изменены
права доступа (даже если в результате фактически ничего не изменилось).
Таким образом, в отношении контроля ошибок она работает аналогично
функции unlink. Поэтому, чтобы изменить права доступа к файлам fred и
barney и выполнить контроль ошибок в каждом случае, необходимо
использовать следующую конструкцию:
foreach $file ("fred","barney") (
unless chmod (0666,$flie) {
warn "hmm... couldn't chmod $file.\$!";
)
}
Изменение принадлежности
Каждый файл в файловой системе (обычный, каталог, файл устройства и т.д.)
имеет владельца и группу. Эти параметры определяют, кому принадлежат
права доступа, установленные для файла по категориям "владелец" и
"группа" (чтение, запись и (или) выполнение). Владелец и группа
определяются в момент создания файла, но при определенных обстоятельствах
вы можете изменить их. (Эти обстоятельства зависят от конкретной
разновидности UNIX, с которой вы работаете; подробности см. на man-
странице chown.)
Функция chown получает идентификатор пользователя (UID), идентификатор
группы (GID) и список имен файлов и пытается изменить принадлежность
каждого из перечисленных файлов в соответствии с указанными
идентификаторами. Успешному результату соответствует ненулевое значение,
равное числу файлов, принадлежность которых изменена (как в функциях
chmod и unlink). Обратите внимание: вы одновременно меняете и владельца,
и группу. Если какой-то из этих идентификаторов вы менять не хотите,
поставьте вместо него -1. Помните, что нужно использовать числовые UID и
GID, а не соответствующие символические имена (хотя команда chmod и
принимает такие имена). Например, если UID файла fred - 1234, а
идентификатор группы stoners, которой этот файл принадлежит по
умолчанию,- 35, то в результате применения следующей команды файлы slate
и granite переходят к пользователю fred и его группе:
chown(1234, 35/ "slate", "granite"); # то же, что и
# chown fred slate granite
# chgrp stoners slate granite
В главе 16 вы узнаете, как преобразовать fred в 1234 и stoners в 35.
ItS. Манипулирование файлами и каталогами
179
Изменение меток времени
С каждым файлом связан набор из трех меток времени. Мы вкратце упоминали
о них, когда говорили о том, как получить информацию о файле: это время
последнего доступа, время последнего изменения и время последнего
изменения индексного дескриптора. Первым двум меткам времени можно
присвоить произвольные значения с помощью функции utime (которая
соответствует системному вызову utime в ОС UNIX). При установке двух этих


