Common Lisp确定目录是否为子目录或其他目录

时间:2014-08-28 23:57:03

标签: lisp common-lisp

我正在使用hunchentoot构建一个简单的Web应用程序,以便将目录树暴露给Web。我遇到的问题是找到一种可靠而安全的方法来确定所请求的目录是否实际上是*share-root*的{​​{1}}的子目录。

我花了很多时间,但这并不是我所需要的(或者我没有以解决问题的方式使用它)。

我的目标是能够接收类似:/srv/share的路径,并意识到应该忽略该请求,因为它要求共享之外的东西。

1 个答案:

答案 0 :(得分:3)

我建议enough-namestring结合truename:if

(enough-namestring foo bar)

是相对路径名,然后foo位于bar下。 换句话说:

(defun pathname-under-p (under top)
  (case (car (pathname-directory (enough-namestring (truename under)
                                                    (truename top))))
    ((nil :relative) t)
    (t nil)))

或只是

(defun pathname-under-p (under top)
  (not (eq :absolute (car (pathname-directory (enough-namestring (truename under)
                                                                 (truename top)))))))

如果您的实现不支持目录上的truename,则必须使用特定于实现的函数或directory

非常感谢@Svante进行调试。