Spec-Zone.ru › Elisp

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

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

В некоторых операционных системах можно задавать более сложные наборы разрешений доступа с помощью таких механизмов, как списки управления доступом (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…

Этот макрос гарантирует, что перед выполнением body переменной default-directory присвоен существующий каталог. Если 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.

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

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

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

(file-modes "~/junk/diffs" 'nofollow)
     ⇒ 492               ; Decimal integer.
(format "%o" 492)
     ⇒ "754"             ; Convert to octal.
(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 (см. раздел Атрибуты файлов).

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Testing-Accessibility.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API