On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

Дескриптор каталога

Для названий дескрипторов каталогов, так же как для дескрипторов файлов, нельзя выбирать зарезервированные слова, их рекомендуется набирать прописными буквами. Причем дескриптор файла 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; # выводит список файлов
}

Алгоритм ее работы таков:

  • открыть текущий каталог как дескриптор каталога с помощью функции DIR;
  • считать список файлов функцией readdir(), показать только оканчивающиеся на pl и затем отсортировать список и связать его с массивом @files;
  • закрыть каталог;
  • вывести содержимое массива на экран.

Функция 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');

Существуют и другие команды для работы с файлами. О них более подробно можно узнать из источников информации, приведенных в конце статьи.

Назад       Главная       Вперёд