Анимация
JavaScript
|
Главная Библионтека А теперь давайте распечатаем код прав доступа к файлу в виде восьмеричного числа, о котором шла речь выше, в разделе "Немного о правах доступа к файлам": printf "%04о\п", $modeS0777; В фрагменте кода некоторые элементы вам могут показаться новыми. Ничего удивительного, о них мы до сих пор еще не упоминали. В информации о правах доступа, возвращаемой функцией stat (и в данном примере помещаемой в переменную 5mode), содержатся "лищние" данные. Поэтому используется конструкция S0777, которая отбрасывает "лишнюю" информацию и оставляет только то, что нам нужно. Данная операция называется маскированием данных, или наложением маски, а число 0777 называется маской. И, наконец, щаблон *04о в функции printf задает восьмеричный формат представления чисел (используются только цифры от 0 до 7), в котором принято в системе UNIX отображать коды прав доступа. Цифра 4 в шаблоне задает ширину поля, а 0 перед ней говорит о том, что к трем восьмеричным числам будет добавлен незначащий нуль. В восьмеричном формате числа представляются точно так же, как и в десятичном, но по основанию 8. При этом значение каждого разряда восьмеричного числа может быть в пределах от 0 до 7. При прибавлении к 7 единицы возникает переполнение. При этом младший разряд сбрасывается в нуль, а к старшему прибавляется единица. Использование восьмеричного формата представления чисел в UNIX, главным образом, дань традиции, которая перешла и в Perl. Если вы окончательно сбиты с толку, не паникуйте. Просто используйте приведенный выше шаблон функции printf для отображения кодов прав доступа к файлам и ни о чем не думайте. Восьмеричная система счисления используется не так часто, поэтому не нагружайте себя лишней информацией. В табл. 10.3 упоминается о трех моментах времени, связанных с файлом. Речь идет о времени доступа к файлу, времени его модификации и времени изменения индекс -ного дескриптора (или создания файла). Здесь под моментом времени следует понимать точную дату и время выполнения операции, которая хранится в довольно необычном формате. В Perl отсчет времени производится в секундах, прошедших с 0 часов но Гринвичу 1 января 1970 года. Поэтому, чтобы вывести дату и время в привычном нам формате, следует воспользоваться функцией localtime, как ноказано ниже на примере: print scalar Этот оператор выводит дату модификации файла в формате, нодобном Hon IVfy 15 14:44:55 2000. Время доступа к файлу (поле - это момент времени, когда файл был последний раз открыт для чтения или записи, а время модификации (поле - когда содержимое файла было последний раз изменено. В системе UNIX в поле $ctime отмечаются моменты времени, когда изменяется индексный дескриптор файла. А это происходит при изменении владельца файла, прав доступа к нему, числа сс1лок на файл и т.д. Таким образом, не стоит полагаться на то, что в данном поле будет находиться время создания файла, хотя в случаев так оно и есть. В системе Windows в поле $ctime находится время создания файла. Иногда для работы необходимо только одно значение из списка, возвращаемого функций stat. В таком случае поместите вызов функции stat в круглые скобки и для выделения нужного элемента из временного списка укажите его номер в квадратных скобках, как показано ниже. print "Размер файлам ("file"))[7], байтов"; Упражнение: переименование группы файлов ВЫПОЛНИВ данное упражнение, вы создадите еще один полезный инструмент, который облегчит вашу дальнейшую работу. Эта небольшая программа позволяет выполнить переименование группы файлов по заданному шаблону, находящихся в указанном каталоге. Предположим, что в каталоге находятся файлы Chapter 01.rtf, и т.д., которые мы хотим переименовать в Поит 02"rtf, Hour 04.rtf и т.д. Выполнить эту задачу средствами командной оболочки дело не из легких, не говоря уже о графических файловых оболочках наподобие программы Проводник в Windows. С помощью текстового редактора введите программу, исходный код которой приведен в листинге 10.3, и сохраните ее в файле Renamer. Сделайте файл выполняемым, как это б1ло описано на 1-м занятии, "Начало работы с Perl". Завершив подготовительные действия, запустите программу с помощью следующей команды: perl Renaner В листинге приведен пример диалога с программой. 1: *!/usr/bin/perl 3: use strict; 4: 5: ny($d±r, $olat, newpat); 6: padrtViSHere кагашг: "; 7: chomp($dir=<STDIN>); 8: print "ВведиФе ивбта ДПН пзска файлов: "; 9: choinp{$oldpat=<STDIK>); 10: print Ъвдгиввстдтатеидстатяайшв: "; 11: chomp($newpat=<STDIN>); 13: opendir(DH, $dir) 11 dig "СПкбка ipzr апьшикагашга $dir: $!"; 14: Iter ef ileB=readdir DH; 15: close(DH); 16: nSoldnane; 17: foreach( Miles){ 18: $oldnaBe=$; 19: s/$oldpat/$newpat/; 20: next if {-e "Sdir/$ "); 21: if (! rename •$diг/Soldname", "$dir/$ ") { 22: vBm "Cш/BsiЩJлтщJaлmEвaшшsшBi $сйАвссев $j 23: } else { 24: Effdi "«b[5n $cldncne перусвее в $ ; 25: > 26: } 1 II. углубляемся e Perl Проведем анализ программы. • Строки 13-15. Все элементы каталога $dir помешаются в массив Sfiles. • Строка 19. Выполняется цикл по всем элементам массива Ш1е8. Очередной элемент массива помешается в переменную $ , а затем присваивается переменной Joldname. Затем в строке 19 исходное имя файла заменяется в переменной $ на новое. • Строка 20. Перед переименованием необходимо убедиться, что файла с таким именем нет в каталоге. В противном случае после переименования первоначальный файл будет утерян. • Строка 25. Выполняется переименование файла. Если по какой-либо причине эта операция не может быть выполнена, выводится соответствующее сообщение. Обратите внимание, что перед именами файлов необходимо указать каталог, например $dir/$oldname Причина заключается в том, что в массиве §files и переменной находятся только имена файлов без пути. .4. Резут раб ]грЕМмы1 Непашег Уанипе каталог: tmp Евэедч;(пе ивб пска файлов: С1не*ег Вхедте мазЕяон дщя пеВЕаная файлов: 1Ёиг Файл QBpber 4.rtf твдеядеЕСвав в Hxir4.rtf ferai Chapter 2.rtf гажетзванв aour2.rtf 1айп Chapbgr~l.rti тадсван в Hoar" l.rtf Резюме На этом занятии речь шла о создании, удалении и переименовании каталогов с помощью функций Perl rakdir, rnidir и rename. Кроме того, вы узнали, как получить дополнительную информацию о файле (размер, время последнего обращения и др.) с помощью функции stat. В качестве примеров на этом занятии были созданы две простые, но очень полезные программы, которые позволяют автоматизировать рутинную работу. Вопросы и ответы Почему приведенн1й ниже фрагмент программы не работает? Несмотря на то что в каталоге есть файлы, содержимое каталога не читается. opendir(DIRHANDLE, "/mydir") 11 die; ifiles=<DIRHANDLE>; closedir(DIRHANDLE); Проблема заключается во второй строке кода. Переменная EPNCIE является дескриптором каталога, а не файла! Содержимое каталога нельзя читать с помощью уг-ловог атора (о). Чтобы исправить ошибку, замените вторую строку на efiles=readdirEJR№MlXE 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |