Анимация
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

Обозначение

Описание

Файл или каталог существует

Файл существует и имеет нулевой размер (каталоги пустыми не бывают)

Файл или каталог существует и имеет ненулевой размер (значение - размер в байтах)

Данный элемент - обычный файл

Данный элемент - каталог

Данный элемент - символическая ссылка

Данный элемент - порт

Данный элемент - именованный канал (FIFO-файл)

Данный элемент - блок-ориентированный файл (например, монтируемый диск)

Данный элемент - байт-ориентированный файл (например, файл устройства ввода-вывода)

У файла или каталога установлен идентификатор пользователя

У файла или каталога установлен идентификатор группы

У файла или каталога установлен бит-липучка

Выполнение операции isatty() над дескриптором файла дало значение "истина"

Файл - текстовый

Файл - двоичный

Время с момента последнего изменения (в днях)

Время с момента последнего доступа (в днях)

Время с момента последнего изменения индексного дескриптора (в днях)

Большинство этих проверок возвращает просто значение "истина" или "ложь". О тех, которые этого не делают, мы сейчас поговорим.

Операция -s возвращает значение "истина", если файл непустой, но это значение особого вида. Это длина файла в байтах, которая интерпретируется как "истина" при ненулевом значении.

Операции -м, -А и -с (да-да, в верхнем регистре) возвращают количество дней соответственно с момента последнего изменения файла, доступа к нему и изменения его индексного дескриптора*. (Индексный дескриптор содержит всю информацию о файле; подробности см. на man-странице, посвященной системному вызову stat.) Возвращаемое значение - десятичное число.

Эти значения определяются относительно времени запуска программы, занесенного в системном формате времени в переменную $ -т. Если запрашиваемое значение относится к событию, которое произошло после начала работы программы, оно может быть отрицательным.



соответствующее прошедшему времени с точностью до 1 секунды: 36 часов возвращается как 1,5 дня. Если при отборе файлов будет выполнено сравнение этого показателя с целым числом (например, с 3), то вы получите только те файлы, которые были изменены ровно столько дней назад, ни секундой раньше и ни секундой позже. Это значит, что для получения всех файлов, значение определенного показателя для которых находится в диапазоне от трех до четырех дней, вам, вероятно, нужно будет использовать операцию сравнения диапазонов*, а не операцию сравнения значений.

Эти операции могут работать не только с именами файлов, но и с дескрипторами. Для этого нужно просто указать в качестве операнда дескриптор файла. Так, чтобы проверить, доступен ли для выполнения файл, открытый как SOMEFILE, можно сделать следующее:

if (-Х SOMEFILE) {

# файл, открытый как SOMEFILE, доступен для выполнения

Если имя или дескриптор файла не указаны (т.е. даны только операции -г или -s), то по умолчанию в качестве операнда берется файл, указанный в переменной $ (опять эта переменная!). Так, чтобы проверить список имен файлов и установить, какие из них доступны для чтения, нужно просто-напросто написать следующее:

foreach (@some list of f ilenames) (

print "$ is readableXn" if -r; # то же, что и -г $

Функции stat и Istat

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

Операнд функции stat - дескриптор файла или выражение, посредством которого определяется имя файла. Возвращаемое значение - либо undef, если вызов неудачен, либо 13-элементный список**, который легче всего описать с помощью такого списка скалярных переменных:

( $dev, $ino, $mode, $nlin]<.,$uid, $gid, $rdev,

$size, $atiroe, $mtime, $ctime, $blksize, Sbloclcs) = stat ( . . . ) * Или операцию int.

** Если вам тяжело запомнить порядок значений, возвращаемых функцией stat, можете обратиться к модулю File: :stat, впервые введенному в выпуске 5 004 Он обеспечивает доступ к этим значениям следующим образом

$file owner = stat($filename)->uid



Имена здесь соответствуют частям структуры stat, подробно описанной на man-странице stat{2). Рекомендуем изучить приведенные там подробные пояснения.

Например, чтобы получить идентификаторы пользователя и группы из файла паролей, нужно записать:

($uid,$gid) = (stat("/etc/passwd"))[4,5];

И этого окажется достаточно.

Вызов функции stat с именем символшгеской ссылки возвращает информацию о том, на что указывает эта ссылка, а не сведения о самой ссылке (если только она не указывает на что-то в текущий момент недоступное). Если вам нужна информация о самой символической ссылке (большей частью бесполезная), используйте вместо stat функцию istat (которая возвращает те же данные в том же порядке). С элементами, которые не являются символическими ссылками, функция Istat работает аналогшшо stat.

Как и в операциях проверки файлов, операнд функций stat и Istat по умолчанию - $ . Это значит, что операция stat будет выполняться над файлом, заданным скалярной переменной $ .

Упражнения

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

1. Напищите программу чтения имени файла из stdin, открытия этого файла и выдачи его содержимого с предварением каждой строки именем файла и двоеточием. Например, если считано имя fred, а файл fred состоял из трех строк, ааа, bbb и ссс, вы должны увидеть fred: ааа, fred: bbb И fred: ссс.

2. Напищите программу, которая приглашает ввести имя входного файла, имя выходного файла, образец поиска и заменяющую строку, после чего копирует входной файл в выходной, заменяя все экземпляры образца этой строкой. Попробуйте выполнить эту программу с несколькими файлами. Можете ли вы заменить существующий файл (не проводите эту операцию над чем-то важным!)? Можете ли вы использовать символы регулярных выражений в искомой строке? Можете ли вы использовать $1 в заменяющей строке?

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

4. Напишите программу чтения списка имен файлов и поиска среди них самого старого. Выведите на экран имя файла и его возраст в днях.



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