26.6.4 Атрибуты файлов

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

Функция: file-newer-than-file-p имя-файла1 имя-файла2

Эта функция возвращает t, если файл имя-файла1 новее, чем файл имя-файла2. Если имя-файла1 не существует, она возвращает nil. Если имя-файла1 существует, но имя-файла2 — нет, она возвращает t. В противном случае она сравнивает время последней модификации файлов.

В следующем примере предполагается, что файл aug-19 был записан 19-го числа, aug-20 — 20-го числа, а файл no-file вообще не существует.

(file-newer-than-file-p "aug-19" "aug-20")
     ⇒ nil
(file-newer-than-file-p "aug-20" "aug-19")
     ⇒ t
(file-newer-than-file-p "aug-19" "no-file")
     ⇒ t
(file-newer-than-file-p "no-file" "aug-19")
     ⇒ nil
Функция: file-has-changed-p имя-файла метка

Эта функция возвращает не nil, если временная метка имя-файла изменилась с момента последнего вызова. При первом вызове для некоторого имя-файла она запоминает время последней модификации и размер файла и возвращает не nil, если имя-файла существует. Впоследствии при вызове для того же имя-файла она сравнивает текущие временную метку и размер с запомненными и возвращает не nil, только если либо временная метка, либо размер (или оба) отличаются. Это полезно, когда программа на Lisp хочет перечитывать файл при каждом его изменении. С необязательным аргументом метка, который должен быть символом, сравнения размера и времени модификации ограничиваются вызовами с той же меткой.

Функция: file-attributes имя-файла &optional формат-id

Эта функция возвращает список атрибутов файла имя-файла. Если указанный файл не существует, она возвращает nil. Эта функция не переходит по символическим ссылкам. Необязательный параметр формат-id задаёт предпочтительный формат атрибутов UID и GID (см. ниже) — допустимые значения: 'string и 'integer. По умолчанию используется последнее, но мы планируем это изменить, поэтому вам следует указывать не nil значение для формат-id, если вы используете возвращаемые UID или GID.

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

Для доступа к элементам этого списка предоставлены функции-аксессоры. Аксессоры упоминаются вместе с описаниями элементов ниже.

Элементы списка по порядку:

  1. t для каталога, строка для символической ссылки (имя, на которое она указывает) или nil для обычного файла (file-attribute-type).
  2. Количество имён файла (file-attribute-link-number). Альтернативные имена, также известные как жёсткие ссылки, можно создавать с помощью функции add-name-to-file (см. Изменение имён и атрибутов файлов).
  3. UID файла, обычно в виде строки (file-attribute-user-id). Однако если он не соответствует именованному пользователю, значение является целым числом.
  4. GID файла, аналогично (file-attribute-group-id).
  5. Время последнего доступа в виде временной метки Lisp (file-attribute-access-time). Временная метка имеет стиль current-time (см. Время суток) и усекается до разрешения временных меток файловой системы; например, в некоторых файловых системах на основе FAT запоминается только дата последнего доступа, поэтому это время всегда будет содержать полночь дня последнего доступа.
  6. Время последней модификации в виде временной метки Lisp (file-attribute-modification-time). Это последнее время, когда содержимое файла было изменено.
  7. Время последнего изменения состояния в виде временной метки Lisp (file-attribute-status-change-time). Это время последнего изменения битов режима доступа к файлу, его владельца и группы, а также другой информации, хранящейся в файловой системе для файла, помимо содержимого файла.
  8. Размер файла в байтах (file-attribute-size).
  9. Режимы файла в виде строки из десяти букв или дефисов, как в ‘ls -l’ (file-attribute-modes).
  10. Неуточнённое значение, присутствующее для обратной совместимости.
  11. Номер инода файла (file-attribute-inode-number), неотрицательное целое число.
  12. Идентификатор устройства файловой системы, на которой находится файл (file-attribute-device-number), целое число или cons-ячейка из двух целых чисел. Последнее иногда используется для удалённых файлов, чтобы отличать удалённые файловые системы от локальных.

Инод и устройство файла вместе дают достаточно информации, чтобы различать любые два файла в системе — никакие два файла не могут иметь одинаковые значения для обоих этих атрибутов. Эта пара, уникально идентифицирующая файл, возвращается функцией file-attribute-file-identifier.

Например, вот атрибуты файла для files.texi:

(file-attributes "files.texi" 'string)
     ⇒  (nil 1 "lh" "users"
          (20614 64019 50040 152000)
          (20000 23 0 0)
          (20614 64555 902289 872000)
          122295 "-rw-rw-rw-"
          t 6473924464520138
          1014478468)

и вот как интерпретируется результат:

nil

не является ни каталогом, ни символической ссылкой.

1

имеет только одно имя (имя files.texi в текущем каталоге по умолчанию).

"lh"

принадлежит пользователю с именем ‘lh’.

"users"

находится в группе с именем ‘users’.

(20614 64019 50040 152000)

последний доступ был 23 октября 2012 года в 20:12:03.050040152 UTC. (Эта временная метка равна (1351023123050040152 . 1000000000), если current-time-list равен nil.)

(20000 23 0 0)

последняя модификация была 15 июля 2001 года в 08:53:43.000000000 UTC. (Эта временная метка равна (1310720023000000000 . 1000000000), если current-time-list равен nil.)

(20614 64555 902289 872000)

последнее изменение состояния было 23 октября 2012 года в 20:20:59.902289872 UTC. (Эта временная метка равна (1351023659902289872 . 1000000000), если current-time-list равен nil.)

122295

имеет длину 122295 байт. (Однако он может не содержать 122295 символов, если некоторые байты принадлежат многобайтовым последовательностям, а также если формат окончания строк — CR-LF.)

"-rw-rw-rw-"

имеет режим чтения и записи для владельца, группы и всех остальных.

t

является просто заполнителем; он не несёт никакой информации.

6473924464520138

имеет номер инода 6473924464520138.

1014478468

находится на устройстве файловой системы с номером 1014478468.

Эта функция возвращает количество имён (т.е. жёстких ссылок), которые имеет файл имя-файла. Если файл не существует, эта функция возвращает nil. Обратите внимание, что символические ссылки не влияют на эту функцию, поскольку они не считаются именами файлов, на которые они указывают. Эта функция не переходит по символическим ссылкам.

$ ls -l foo*
-rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo
-rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo1

(file-nlinks "foo")
     ⇒ 2
(file-nlinks "doesnt-exist")
     ⇒ nil