26.6.1 Проверка доступности

Эти функции проверяют наличие прав доступа к файлу для чтения, записи или выполнения. Если явно не указано иное, они следуют за символическими ссылками. См. Различие видов файлов.

В некоторых операционных системах могут быть заданы более сложные наборы прав доступа через такие механизмы, как списки управления доступом (ACL). См. Расширенные атрибуты файлов о том, как запрашивать и устанавливать эти права.

Функция: file-exists-p filename

Эта функция возвращает t, если файл с именем filename, по-видимому, существует. Это не означает, что вы обязательно можете прочитать файл, только то, что вы, вероятно, можете узнать его атрибуты. (В GNU и других POSIX-подобных системах это истинно, если файл существует и у вас есть право выполнения для содержащих его каталогов, независимо от прав самого файла.)

Если файл не существует или возникли проблемы с определением существования файла, эта функция возвращает nil.

Поскольку имя файла, являющееся пустой строкой, интерпретируется относительно каталога по умолчанию текущего буфера (см. Абсолютные и относительные имена файлов), вызов file-exists-p с аргументом, являющимся пустой строкой, сообщит о каталоге по умолчанию буфера.

Каталоги являются файлами, поэтому file-exists-p может возвращать t при передаче каталога. Однако, поскольку file-exists-p следует за символическими ссылками, он возвращает t для имени символической ссылки только в том случае, если цель ссылки существует; если вашей Lisp-программе необходимо считать висячие символьные ссылки, цель которых не существует, существующими файлами, используйте file-attributes (см. Атрибуты файлов) вместо file-exists-p.

Функция: file-readable-p filename

Эта функция возвращает t, если файл с именем filename существует и вы можете его читать. В противном случае возвращает nil.

Функция: file-executable-p filename

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

Функция: file-writable-p filename

Эта функция возвращает t, если файл filename может быть записан или создан вами, и nil в противном случае. Файл доступен для записи, если он существует и вы можете в него записывать. Он доступен для создания, если он не существует, но его родительский каталог существует и вы можете записывать в этот каталог.

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

(file-writable-p "~/no-such-dir/foo")
     ⇒ nil
Функция: file-accessible-directory-p dirname

Эта функция возвращает t, если у вас есть право открывать существующие файлы в каталоге, имя которого как файла — dirname; в противном случае (например, если такого каталога нет) возвращает nil. Значение dirname может быть либо именем каталога (например, /foo/), либо именем файла, являющегося каталогом (например, /foo, без завершающей косой черты).

Например, из следующего мы делаем вывод, что любая попытка прочитать файл в /foo/ приведёт к ошибке:

(file-accessible-directory-p "/foo")
     ⇒ nil
Макрос: with-existing-directory body…

Этот макрос гарантирует, что default-directory привязан к существующему каталогу перед выполнением body. Если default-directory уже существует, он предпочтителен, а в противном случае используется некоторый другой каталог. Этот макрос может быть полезен, например, при вызове внешней команды, которая требует, чтобы она выполнялась в существующем каталоге. Выбранный каталог не гарантированно доступен для записи.

Функция: access-file filename string

Если вы можете читать filename, эта функция возвращает nil; в противном случае она сигнализирует об ошибке, используя string в качестве текста сообщения об ошибке.

Если пользовательская опция remote-file-name-access-timeout является положительным числом, функция сигнализирует об ошибке, если она не завершается за это время (в секундах). Это применяется только к удалённым файлам и только тогда, когда нет дополнительного времени, затрачиваемого на чтение паролей или тому подобное.

Функция: file-ownership-preserved-p filename &optional group

Эта функция возвращает t, если при удалении файла filename и последующем его создании заново владелец файла останется неизменным. Она также возвращает t для несуществующих файлов.

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

Эта функция не следует за символическими ссылками.

Функция: file-modes filename &optional flag

Эта функция возвращает биты режима файла filename — целое число, обобщающее его права на чтение, запись и выполнение. Эта функция следует за символическими ссылками. Если файл не существует, возвращаемое значение — nil.

См. Права доступа к файлам в Руководстве GNU Coreutils для описания битов режима. Например, если младший бит равен 1, файл доступен для выполнения всеми пользователями; если второй бит снизу равен 1, файл доступен для записи всеми пользователями; и т.д. Максимально возможное значение — 4095 (7777 в восьмеричной системе), что означает, что каждый имеет права на чтение, запись и выполнение, установлен бит SUID как для других, так и для группы, и установлен липкий бит.

По умолчанию эта функция следует за символическими ссылками. Однако, если необязательный аргумент flag является символом nofollow, эта функция не следует за filename, если это символическая ссылка; это может помочь предотвратить непреднамеренное получение битов режима файла в другом месте и более согласовано с file-attributes (см. Атрибуты файлов).

См. Изменение имён и атрибутов файлов о функции set-file-modes, которая может использоваться для установки этих прав.

(file-modes "~/junk/diffs" 'nofollow)
     ⇒ 492               ; Десятичное целое.
(format "%o" 492)
     ⇒ "754"             ; Преобразование в восьмеричное.

(set-file-modes "~/junk/diffs" #o666 'nofollow)
     ⇒ nil

$ ls -l diffs
-rw-rw-rw- 1 lewis lewis 3063 Oct 30 16:00 diffs

Примечание для MS-DOS: В MS-DOS не существует такого понятия, как бит режима исполняемого файла. Поэтому file-modes считает файл исполняемым, если его имя заканчивается одним из стандартных расширений исполняемых файлов, таких как .com, .bat, .exe и некоторыми другими. Файлы, начинающиеся с сигнатуры ‘#!’ по стандарту POSIX, такие как скрипты оболочки и Perl, также считаются исполняемыми. Каталоги также сообщаются как исполняемые для совместимости с POSIX. Эти соглашения также соблюдаются функцией file-attributes (см. Атрибуты файлов).