【问题标题】:sbcl determine if symbolic linksbcl 判断是否符号链接
【发布时间】:2015-10-03 20:37:15
【问题描述】:
如何测试路径名是否是 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
这些似乎都没有用。分类符号链接似乎是一个关键字。
【问题讨论】:
标签:
common-lisp
symlink
sbcl
【解决方案1】:
TL;DR
(defun symlinkp (pathname)
(sb-posix:s-islnk (sb-posix:stat-mode (sb-posix:lstat pathname))))
要回答首先要问的问题,如何确定某物(我认为是文件描述符)是否是 posix 中的符号链接。 man 2 stat 来救援。从手册页
lstat() 与 stat() 相同,除了如果 path 是非符号链接,则链接本身是 stat-ed,而不是它所引用的文件。
定义了以下 POSIX 宏以使用 st_mode 字段检查文件类型:
S_ISLNK(m) 符号链接? (不在 POSIX.1-1996 中。)
【解决方案2】:
osicat具有file-kind功能,可以检测符号链接:
(ql:quickload "osicat")
(equalp :symbolic-link (osicat:file-kind "/some/path"))
更新:如果您使用"/some/path/",此功能有问题并且不起作用。 (注意尾部的斜线。)