В этом разделе описывается, как различать различные виды файлов, такие как каталоги, символические ссылки и обычные файлы.
Символические ссылки обычно следуются везде, где они встречаются. Например, чтобы интерпретировать имя файла a/b/c, любой из a, a/b и a/b/c может быть символической ссылкой, за которой следует, возможно, рекурсивно, если целевые ссылки сами являются символическими ссылками. Однако некоторые функции не следуют символическим ссылкам в конце имени файла (a/b/c в этом примере). Такая функция называется не следующей за символическими ссылками.
Если файл 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, описанные в Truenames.
Эта функция возвращает 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
Эта функция возвращает t, если файл filename существует и является обычным файлом (не каталогом, именованным каналом, терминалом или другим устройством ввода-вывода).
Она возвращает nil, если filename не существует или не является обычным файлом, или если возникли проблемы с определением того, является ли он обычным файлом.
Эта функция следует символическим ссылкам.