Анимация
JavaScript
|
Главная Библионтека Чтение дескриптора каталога Открыв дескриптор каталога, мы можем прочитать список имен с помощью функции 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 |