Поиск

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

Для получения подробной информации о файле в Perl используется функция stat. Поскольку прототип этой функции взят из UNIX, а структура файловой системы UNIX отличается от принятой в других ОС, возвращаемые функцией stat данные зависят от конкретной операционной системы. Синтаксис функции stat выглядит так:

Таким образом, функция stat позволяет получать информацию как подескриптору файла (если файл уже был открыт), так и по имени файла. В любой операционной системе функция stat возвращает список, состоящий из 13 элементов, которые описывают атрибуты файла. Сами значения элементов этого списка зависят от типа операционной системы, в которой используется интерпретатор Perl. Причина заключается в том, что файловые системы некоторых операционных систем могут не поддерживать те или иные атрибуты. В табл. 10.3 описаны возвращаемые функцией stat элементы списка для двух популярных операционных систем: UNIX и Windows.

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

Вот пример использования функции stat:

Обычно возвращаемые функцией stat значения присваивают списку скаляров, которым назначены осмысленные имена, например:

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

В этбм фрагменте кода некоторые элементы вам могут показаться новыми. Ничего удивительного, о них мы до сих пор еще не упоминали. В информации о правах доступа, возвращаемой функцией stat (и в данном примере помещаемой в переменную $mode), содержатся "лишние" данные. Поэтому используется конструкция &0777, которая отбрасывает "лишнюю" информацию и оставляет только то, что нам нужно. Данная операция называется маскированием данных, или наложением маски, а число 0777 называется маской. И, наконец, шаблон %04о в функции printf задает восьмеричный формат представления чисел (используются только цифры от 0 до 7), в котором принято в системе UNIX отображать коды прав доступа. Цифра 4 в шаблоне задает ширину поля, а 0 перед ней говорит о том, что к трем восьмеричным числам будет добавлен незначащий нуль.

В восьмеричном формате числа представляются точно так же, как и в десятичном, но по основанию 8. При этом значение каждого разряда восьмеричного числа может быть в пределах от 0 до 7. При прибавлении к 7 единицы возникает переполнение. При этом младший разряд сбрасывается в нуль, а к старшему прибавляется единица. Использование восьмеричного формата представления чисел в UNIX, главным образом, дань традиции, которая перешла и в Perl. Если вы окончательно сбиты с толку, не паникуйте. Просто используйте приведенный выше шаблон функции printf для отображения кодов прав доступа к файлам и ни о чем не думайте. Восьмеричная система счисления используется не так часто, поэтому не нагружайте себя лишней информацией.

В табл. 10.3 упоминается о трех моментах времени, связанных с файлом. Речь идет о времени доступа к файлу, времени его модификации и времени изменения индексного дескриптора (или создания файла). Здесь под моментом времени следует понимать точную дату и время выполнения операции, которая хранится в довольно необычном формате. В Perl отсчет времени производится в секундах, прошедших с 0 часов по Гринвичу 1 января 1970 года. Поэтому, чтобы вывести дату и время в привычном нам формате, следует воспользоваться функцией localtime, как показано ниже на примере:

Этот оператор выводит дату модификации файла в формате, подобном Mon May 15 14:44:55 2000. Время доступа к файлу (поле $atime) — это момент времени, когда файл был последний раз открыт для чтения или записи, а время модификации (поле $mtime) — когда содержимое файла было последний раз изменено. В системе UNIX в поле $ctime отмечаются моменты времени, когда изменяется индексный дескриптор файла. А это происходит при изменении владельца файла, прав доступа к нему, числа ссылок на файл и т.д. Таким образом, не стоит полагаться на то, что в данном поле будет находиться время создания файла, хотя в большинстве случаев так оно и есть. В системе Windows в поле $ctime находится время создания файла.

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