sbcl определяет, является ли символическая ссылка

Как я могу проверить, является ли путь символической ссылкой в ​​sbcl?

CL-USER> (apropos "syml" )
:CLASSIFY-SYMLINKS (bound)
:RESOLVE-SYMLINKS (bound)
:SYMLINK (bound)
SB-IMPL::CLASSIFY-SYMLINKS
SB-IMPL::RESOLVE-PROBLEMATIC-SYMLINK
SB-IMPL::RESOLVE-SYMLINKS
SB-POSIX:SYMLINK (fbound)
UIOP/FILESYSTEM:*RESOLVE-SYMLINKS* (bound)
UIOP/FILESYSTEM:RESOLVE-SYMLINKS (fbound)
UIOP/FILESYSTEM:RESOLVE-SYMLINKS* (fbound)
UTIL::CLASSIFY-SYMLINKS
UTIL::SYMLINK
; No value

Ничто из этого не кажется полезным. classify-symlinks представляется ключевым словом.

2 ответа

Решение

TL;DR

(defun symlinkp (pathname)
  (sb-posix:s-islnk (sb-posix:stat-mode (sb-posix:lstat pathname))))

Чтобы ответить на вопрос, нужно сначала спросить, как определить, является ли что-то (дескриптор файла, я полагаю) символической ссылкой в ​​posix. Человек 2 стат на помощь. Из справочной страницы

  • lstat () идентичен stat (), за исключением того, что если path является асимболической ссылкой, то сама ссылка является статовой, а не файлом, на который она ссылается.

  • Следующие макросы POSIX определены для проверки типа файла с помощью поля st_mode:

  • S_ISLNK (м) символическая ссылка? (Не в POSIX.1-1996.)

Осикат имеет функцию file-kindкоторый может обнаруживать символические ссылки:

      (ql:quickload "osicat")

(equalp :symbolic-link (osicat:file-kind "/some/path"))

Обновление: эта функция содержит ошибки и не работает, если вы используете "/some/path/". (Обратите внимание на косую черту в конце.)

Другие вопросы по тегам