Анимация
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

А теперь давайте распечатаем код прав доступа к файлу в виде восьмеричного числа, о котором шла речь выше, в разделе "Немного о правах доступа к файлам":

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