Получение информации о файле
Мы знаем, что в файловой системе 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 () или сохранения результатов ее выполнения в переменных программы.