Spec-Zone.ru › Elisp

Различение типов файлов

Этот раздел описывает, как различать различные типы файлов, такие как каталоги, символические ссылки и обычные файлы.

Символические ссылки обычно следуют за ними, где бы они ни появлялись. Например, чтобы интерпретировать имя файла a/b/c, любой из a, a/b и a/b/c может быть символической ссылкой, за которой следует, возможно, рекурсивно, если целевые ссылки сами являются символическими ссылками. Однако некоторые функции не следуют за символическими ссылками в конце имени файла (a/b/c в этом примере). Такая функция называется не следующей за символическими ссылками.

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

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

Если файл filename не является символической ссылкой, не существует или если возникли проблемы с определением того, является ли он символической ссылкой, file-symlink-p возвращает nil.

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

(file-symlink-p "not-a-symlink")
     ⇒ nil
(file-symlink-p "sym-link")
     ⇒ "not-a-symlink"
(file-symlink-p "sym-link2")
     ⇒ "sym-link"
(file-symlink-p "/bin")
     ⇒ "/pub/bin"

Обратите внимание, что в третьем примере функция вернула sym-link, но не продолжила ее разрешение, хотя этот файл сам является символической ссылкой. Это потому, что эта функция не следует за символическими ссылками — процесс следования за символическими ссылками не применяется к последнему элементу имени файла.

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

(file-symlink-p "/foo/bar/baz")
     ⇒ "some-file"

Здесь, хотя /foo/bar/baz было предоставлено как полностью квалифицированное имя файла, результат не является таковым и, фактически, не содержит никаких ведущих директорий. И поскольку some-file само может быть символической ссылкой, вы не можете просто добавить к нему ведущие директории, а также не можете просто использовать expand-file-name (см. Расширение имен файлов) для получения его абсолютного имени файла.

По этой причине эта функция редко полезна, если вам нужно определить больше, чем просто тот факт, является ли файл символической ссылкой или нет. Если вам действительно нужно имя файла целевой ссылки, используйте file-chase-links или file-truename, описанные в Истинные имена.

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

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

(file-directory-p "~rms")
     ⇒ t
(file-directory-p "~rms/lewis/files.texi")
     ⇒ nil
(file-directory-p "~rms/lewis/no-such-file")
     ⇒ nil
(file-directory-p "$HOME")
     ⇒ nil
(file-directory-p
 (substitute-in-file-name "$HOME"))
     ⇒ t
Функция: file-regular-p filename

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

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

Spec-Zone.ru

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