Для названий дескрипторов каталогов, так же как для дескрипторов файлов, нельзя выбирать зарезервированные слова, их рекомендуется набирать прописными буквами. Причем дескриптор файла FRED и дескриптор каталога FRED не связаны между собой. В Perl имеется несколько функций, позволяющих работать с каталогами. Можно создать каталог с помощью функции mkdir(), стереть ≈ с использованием rmdir (), а для перемещения по дереву каталогов служит chdir().
Чтобы получить список файлов, находящихся в каком-либо каталоге, используются функции: opendir(), readdir() и closedir().Ниже приведена программа, показывающая, как вывести список всех Perl-программ, оканчивающихся на pl в текущем каталоге:
opendir(DIR, ■.■); # открыть каталог @files = sort(grep(/pl$/, readdir(DIR))); # массив файлов closedir(DIR); # закрыть каталог foreach (@files) { print(■$_\n■) unless -d; # выводит список файлов }
Алгоритм ее работы таков:
Функция chdir в Perl имеет один аргумент типа выражения. При его вычислении определяется имя текущего каталога. В случае его успешного изменения возвращается значение true, а при неудачном ≈ false. Например, чтобы перейти в корень дерева каталогов и вывести там список всех файлов, нужно сделать следующее:
chdir (■/■) || die ■Невозможно перейти в / ($!)■; opendir(DIR, ■.■); @files = sort(grep(/$_/, readdir(DIR))); closedir(DIR); foreach (@files) { print(■$_\n■) unless -d; }
Круглые скобки после chdir ставить необязательно.
Синтаксис функции создания каталога:
mkdir (DIRNAME, MODE),
где DIRNAME ≈ имя каталога, заключенное в кавычки, а MODE ≈ права доступа. Так, чтобы создать каталог MYDIR, всем доступный и предоставляющий равные права, необходимо ввести команду
mkdir (■MYDIR■, 0777) || die ■Невозможно создать MYDIR: $!■;
Если требуется удалить каталог, на помощь придет функция rmdir:
rmdir (■MYDIR■) || die ■Невозможно удалить MYDIR: $!■;
Эта Unix-команда позволяет удалять только пустые каталоги. В Unix, как и в Windows NT, есть такое понятие, как право доступа к файлам и каталогам. С помощью функции chmod() можно устанавливать для файлов уникальные атрибуты. Например, чтобы сделать файлы ╚1.txt╩ и ╚2.txt╩ доступными для чтения и записи всем пользователям, нужно выполнить операцию
chmod (0666, ■1.txt■, ■2.txt■);
Восьмеричное число, находящееся в круглых скобках, ≈ цифровое представление режима доступа, а цифра 0666 обозначает чтение и запись для всех пользователей.
Чтобы изменить права доступа к файлам ╚1.txt╩ и ╚2.txt╩ и проконтролировать ошибки, нужно использовать следующую конструкцию:
foreach $files (■1.txt■, ■2.txt■) { unless chmod (0666, $files) { warn ■Невозможно изменить права доступа для $files.\n$!■; } }
Каждый файл и каждый каталог обладают двумя параметрами ≈ ╚владелец╩ и ╚группа╩, которые определяют, кому принадлежат права доступа, установленные для файла по категориям (чтение, запись и/или создание). Значения параметров выявляются при создании файла. Покажем, как можно изменять их для списка файлов. Первые два элемента списка должны представлять собой числовой UID (идентификатор пользователя) и GID (идентификатор группы):
$cnt = chown $uid, $gid, ▒foo▓, ▒bar▓; chown $uid, $gid, @filenames;
Успешному выполнению операции соответствует ненулевое значение, равное числу файлов, принадлежность которых изменена (как в функции chmod). В листинге 1 приведен пример поиска нечисловых UID в файле passwd.
Листинг 1
print ■Пользователь: ■; $user =; chop($user); print ■Файлы: ■ $pattern = ; chop($pattern); open(pass, ▒/etc/passwd▓) || die ■Не могу открыть passwd: $!\n■; while ( ) { ($login,$pass,$uid,$gid) = split(/:/); $uid{$login} = $uid; $gid{$login} = $gid; } @ary = <${pattern}>; # Получить имена файлов if ($uid{$user} eq ▒▓) { die ■$user отсутствует в файле passwd■; } else { chown $uid{$user}, $gid{$user}, @ary; }
Существуют также операции переименования и удаления файлов. Во втором случае используют функцию unlink(), которая убирает все файлы из списка, заданного в качестве параметра, и возвращает список успешно удаленных:
$cnt = unlink ▒1.txt▓, ▒2.txt▓, ▒3.txt▓;
или
@goners = (▒1.txt▓, ▒2.txt▓, ▒3.txt▓); unlink @goners;
или
unlink <*.txt>;
Функция unlink() не позволяет убирать каталоги, если пользователь не обладает правами администратора системы. Учтите, что ее следует применять крайне осторожно, а при работе с каталогами целесообразно предпочесть rmdir ().
Чтобы переименовать файл, нужно воспользоваться функцией rename. При успешном выполнении она возвращает результат, равный 1, иначе 0. С помощью этой функции можно также переносить файлы из одного каталога в другой, например:
rename (■e:/1.txt■,■d:/1.txt■);
или
rename (■/docs/1.txt■,■/docs/add/1.txt■);
Если же вы хотите просто переименовать какой-то файл, то пути к файлам должны совпадать, например:
rename (■1.txt■,■2.txt■);
Существуют и другие команды для работы с файлами. О них более подробно можно узнать из источников информации, приведенных в конце статьи.
Назад | Содержание | Вперед