Первый сайт на Perl



Получение информации о файле

Мы знаем, что в файловой системе UNIX информация о файле хранится в его индексном дескрипторе (inode). Структура индексного дескриптора состоит из 13 полей, для которых используются специальные обозначения. Все они перечислены в табл. 7.2.

Таблица 7.2. Структура индексного дескриптора

Поле

Описание

dev

Номер устройства в файловой системе

ino

Номер индексного дескриптора

mode

Режим файла (тип и права доступа)

nlink

Количество жестких ссылок на файл (в отсутствии ссылок равно 1)

uid

Числовой идентификатор владельца файла

gid

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

rdev

Идентификатор устройства (только для специальных файлов)

size

Размер файла в байтах

a time

Время последнего обращения к файлу с начала эпохи

mtime

Время последнего изменения файла с начала эпохи

с time

Время изменения индексного дескриптора с начала эпохи

blksize

Предпочтительный размер блока для операций ввода/вывода

blocks

Фактическое количество выделенных блоков для размещения файла

Замечание

Начало эпохи датируется 1 января 1970 года 0 часов 0 минут.

 

Замечание

Не все перечисленные в табл. 7.2 поля структуры индексного дескриптора поддерживаются всеми файловыми системами.

Для получения значений полей структуры индексного дескриптора файла в Perl предназначена функция stato. Ее единственным параметром может быть либо имя файла, либо дескриптор открытого в программе файла. Она возвращает список из 13 элементов, содержащих значения полей структуры индексного дескриптора файла в том порядке, как они перечислены в табл. 7.2. Типичное использование в программе Perl представлено ниже

($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);

Присваивание значений полей списку скалярных переменных с идентификаторами, соответствующими названиям полей, способствует лучшей читаемости программы, чем присваивание массиву скаляров:

@inode = stat($filename);

В последнем случае получить значение соответствующего поля можно только с помощью индекса, что не совсем удобно, так как надо помнить номер нужного поля структуры.

Если при обращении к функции stato не указан параметр, то она возвращает структуру индексного дескриптора файла, чье имя содержится в специальной переменной $_.

Функция получения информации о файле при успешном выполнении в списковом контексте возвращает список значений полей структуры индексного дескриптора файла или пустой список в случае неудачного завершения. В скалярном контексте она возвращает булево значение Истина или Ложь в зависимости от результатов своего выполнения.

Для удобства использования информации о файле функция stato при успешном выполнении кэширует полученные значения полей. Если вызвать эту функцию со специальным дескриптором файла _ (символ подчеркивания), то она возвратит информацию, хранящуюся в кэше от предыдущего ее вызова. Это позволяет проверять различные атрибуты файла без повторного вызова функции stat () или сохранения результатов ее выполнения в переменных программы.

Функцию stato можно использовать для получения структуры индексного дескриптора не только файла, но и жестких ссылок на него, а также каталогов, так как они являются также файлами, блоки данных которых содержат имена файлов каталога и их числовых индексных дескрипторов. Для получения информации о символических ссылках следует использовать функцию is tat о, которая возвращает список значений полей структуры индексного дескриптора самой ссылки, а не файла, на который она ссылается. Эта функция работает аналогично функции stat (), включая использование специального дескриптора _.

Замечание

Если операционная система не поддерживает символические ссылки, то обращение к функции Istat {} заменяется обращением к функции stat ().

Кроме двух этих функций, позволяющих получать информацию о файлах системы, в Perl предусмотрен набор унарных операций, возвращающих значение только одного поля структуры индексного дескриптора. Эти операции в документации называются "операциями -х", так как их названия состоят из дефиса с последующим единственным символом. Все они являются унарными именованными операциями и имеют свой приоритет в сложных выражениях, о котором мы рассказывали в гл. 3. Полный перечень унарных операций проверки атрибутов файлов представлен в табл. 7.3.

Таблица 7.3. Унарные именованные операции проверки файлов

Операция

Проверяемый атрибут

-r

Файл может читаться эффективным uid/gid

-W

Записывать в файл может эффективный uid/gid


Файл может выполняться эффективным uid/gid


Владельцем файла является эффективный uid

-R

Файл может читаться действительным uid/gid

-W

Записывать в файл может действительный uid/gid

-X

Файл может выполняться действительный uid/gid

-0

Владельцем файла является действительный uid


Файл существует

-Z

Размер файла равен нулю

-S

Размер файла отличен от нуля (возвращается размер)

-f

Файл является обычным (plain) файлом

-d

Файл является каталогом

-1

Файл является символической ссылкой


Файл является именованным программным каналом (FIFO) или проверяемый дескриптор связан с программным каналом

-S

Файл является сокетом

-b

Файл является специальным блочным файлом

™ С

Файл является специальным символьным файлом

-t

Дескриптор файла связан с терминалом


У файла установлен бит setuid

-g

У файла установлен бит setgid

-k

У файла установлен бит запрета (sticky bit)

-k

У файла установлен бит запрета (sticky bit)


Файл является текстовым файлом.

-b

Файл является двоичным (противоположным текстовому)


Возраст файла в днях на момент выполнения программы


То же для времени последнего обращения к файлу


То же для времени последней модификации индексного дескриптора файла

Унарные операции применяются к строке, содержащей имя файла, к выражению, вычисляемым значением которого является имя файла, или к файловому дескриптору Perl. Если параметр операции не задан, то она тестирует файл, чье имя содержится в специальной переменной $_. Каждая операция проверки атрибута файла возвращает 1, если файл обладает соответствующим атрибутом, пустую строку "" в противном случае и неопределенное значение undef, если указанный в параметре файл не существует.

Несколько слов об алгоритме определения текстовых и двоичных файлов (операции -т и -в). Эти операции анализируют содержимое первого блока файла на наличие "странных" символов — необычных управляющих последовательностей или байтов с установленными старшими битами. Если обнаружено достаточно большое количество подобных символов (больше 30%), то файл считается двоичным, иначе текстовым. Любой файл с пустым первым блоком рассматривается как двоичный.

Если эти операции применяются к файловым дескрипторам Perl, то проверяется содержимое буфера ввода/вывода, а не первого блока файла. Обе эти операции, примененные к файловым дескрипторам, возвращают булево значение Истина, если ввязанный с дескриптором файл пуст или установлен на конец файла.

При выполнении унарных именованных операций проверки файла на самом деле неявно вызывается функция statо, причем результаты ее вычисления кэшируются, что позволяет использовать специальный файловый дескриптор _ для ускорения множественных проверок файла:

if( -s("filename") && -Т J {

^ Что-то делаем для текстовых файлов не нулевого размера.

}

Назад Начало Вперед