Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 [ 54 ] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

Чтение дескриптора каталога

Открыв дескриптор каталога, мы можем прочитать список имен с помощью функции readdir, которая принимает единственный параметр - дескриптор каталога. Каждый вызов readdir в скалярном контексте возвращает следующее имя файла (только основное имя: в возвращаемом значении никаких косых нет) в порядке, который на первый взгляд кажется случайным*. Если больще имен нет, readdir возвращает undef**. Вызов readdir в списочном контексте возвращает все оставшиеся имена файлов в виде списка с одним именем, приходящимся на каждый элемент. Вот пример, в котором выдается перечень всех имен файлов, содержащихся в каталоге /etc:

opendir(ETC,"/etc") die "no etc?: $i";

while ($name = readdir(ETC)) { # скалярный контекст, по одному на цикл print "$name\n"; #выводит ., .., passwd, group и т.д.

closedir(ETC);

А вот как можно получить все имена в алфавитном порядке с помощью функции sort:

opendir (ETC, "/etc") I I die "no etC: $",•

foreach $name (sort readdir(ETC}) ( # списочный контекст с сортировкой print "Sname\n"; #еыводит ., .., passwd, group и т.д.

closedir(ETC);

В этот список включены имена файлов, которые начинаются с точки. Это не похоже на результат развертывания, выполненного с использованием <* >, при котором имена, начинающиеся с точки, не возвращаются. С другой стороны, это похоже на результат работы команды echo* shell.

* Точнее говоря - это порядок, в котором имена файлов расположены в каталоге, т е тот же "беспорядочный порядок", в котором вы получаете файлы в ОС UNIX в результате вызова команды find или /? -/

** Это означает, что при работе с опцией-W вам придется использовать цикл while (defined ($name = readdir (...))



Упражнения

Ответы см. в приложении А.

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

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



в этой главе:

• Удаление файла

• Переименование файла

• Создание для файла альтернативных имен: связывание ссылками

• Создание и удаление


каталогов Измснет доступа

• «-рае Манипулирование

• u;::z:Locmu файлами и

. ш..н.т.е меток кашалогамп

• Упражнения

В этой главе мы покажем, как можно манипулировать самими файлами, а не только содержащимися в них данными. При демонстрации процедуры доступа к файлам и каталогам мы будем пользоваться семантикой UNIX (а также POSIX и Linux). Есть и другие механизмы доступа к файловым системам, но описываемые здесь средства являются стандартными для современных файловых систем.

Удаление файла

Вы уже научились создавать в Perl файл, открывая его для вывода через дескриптор файла. Сейчас мы освоим опасную процедуру удаления файлов (очень кстати для тринадцатой главы, не правда ли?).

Perl-функция unlink (названная по имени системного вызова POSIX) удаляет одно из имен файла (который может иметь и другие имена). Когда удаляется последнее имя файла и ни в одном процессе он не открыт, удаляется и сам файл. Это в точности соответствует тому, что делает UNIX-команда гт. Поскольку у файла часто бывает только одно имя (еслтг вы не создавали жесткие ссылки), то в большинстве случаев удаление имени можно считать удалением файла. Приняв это допущение, покажем, как удалить файл fred, а затем удалить файл, имя которого вводится во время выполнения профаммы:

unlink ("fred"); # распрощаемся с файлом fred print "what file do you want to delete? ";



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 [ 54 ] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103