Эти функции проверяют наличие прав доступа к файлу для чтения, записи или выполнения. Если явно не указано иное, они следуют за символическими ссылками. См. Различие видов файлов.
В некоторых операционных системах могут быть заданы более сложные наборы прав доступа через такие механизмы, как списки управления доступом (ACL). См. Расширенные атрибуты файлов о том, как запрашивать и устанавливать эти права.
Эта функция возвращает t, если файл с именем filename,
по-видимому, существует. Это не означает, что вы обязательно можете
прочитать файл, только то, что вы, вероятно, можете узнать его атрибуты.
(В GNU и других POSIX-подобных системах это истинно, если файл существует
и у вас есть право выполнения для содержащих его каталогов, независимо
от прав самого файла.)
Если файл не существует или возникли проблемы с определением
существования файла, эта функция возвращает nil.
Поскольку имя файла, являющееся пустой строкой, интерпретируется
относительно каталога по умолчанию текущего буфера (см. Абсолютные и относительные имена файлов),
вызов file-exists-p с аргументом, являющимся пустой строкой,
сообщит о каталоге по умолчанию буфера.
Каталоги являются файлами, поэтому file-exists-p может возвращать
t при передаче каталога. Однако, поскольку file-exists-p
следует за символическими ссылками, он возвращает t для имени
символической ссылки только в том случае, если цель ссылки существует;
если вашей Lisp-программе необходимо считать висячие символьные ссылки,
цель которых не существует, существующими файлами, используйте
file-attributes (см. Атрибуты файлов) вместо
file-exists-p.
Эта функция возвращает t, если файл с именем filename
существует и вы можете его читать. В противном случае возвращает
nil.
Эта функция возвращает t, если файл с именем filename
существует и вы можете его выполнить. В противном случае возвращает
nil. В GNU и других POSIX-подобных системах, если файл является
каталогом, право выполнения означает, что вы можете проверять
существование и атрибуты файлов внутри каталога и открывать эти
файлы, если их режимы это разрешают.
Эта функция возвращает t, если файл filename может быть
записан или создан вами, и nil в противном случае. Файл
доступен для записи, если он существует и вы можете в него записывать.
Он доступен для создания, если он не существует, но его родительский
каталог существует и вы можете записывать в этот каталог.
В примере ниже foo не доступен для записи, потому что родительский каталог не существует, даже если пользователь мог бы создать такой каталог.
(file-writable-p "~/no-such-dir/foo")
⇒ nil
Эта функция возвращает t, если у вас есть право открывать
существующие файлы в каталоге, имя которого как файла — dirname;
в противном случае (например, если такого каталога нет) возвращает
nil. Значение dirname может быть либо именем каталога
(например, /foo/), либо именем файла, являющегося каталогом
(например, /foo, без завершающей косой черты).
Например, из следующего мы делаем вывод, что любая попытка прочитать файл в /foo/ приведёт к ошибке:
(file-accessible-directory-p "/foo")
⇒ nil
Этот макрос гарантирует, что default-directory привязан к
существующему каталогу перед выполнением body. Если
default-directory уже существует, он предпочтителен, а в
противном случае используется некоторый другой каталог. Этот макрос
может быть полезен, например, при вызове внешней команды, которая
требует, чтобы она выполнялась в существующем каталоге. Выбранный
каталог не гарантированно доступен для записи.
Если вы можете читать filename, эта функция возвращает
nil; в противном случае она сигнализирует об ошибке,
используя string в качестве текста сообщения об ошибке.
Если пользовательская опция remote-file-name-access-timeout
является положительным числом, функция сигнализирует об ошибке, если
она не завершается за это время (в секундах). Это применяется только
к удалённым файлам и только тогда, когда нет дополнительного времени,
затрачиваемого на чтение паролей или тому подобное.
Эта функция возвращает t, если при удалении файла
filename и последующем его создании заново владелец файла
останется неизменным. Она также возвращает t для несуществующих
файлов.
Если необязательный аргумент group не равен nil, эта
функция также проверяет, что группа файла останется неизменной.
Эта функция не следует за символическими ссылками.
Эта функция возвращает биты режима файла 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 (см. Атрибуты файлов).