指定路径名基本上有两种方式:
字符串显然取决于平台:例如 Unix 语法与 Windows 语法。
"/Users/foo/bar.text" is a valid pathname
"/Users/foo/*/foo.*" is a valid pathname with two wildcards
您可以从字符串创建路径名对象:
? (pathname "/Users/bar/foo.text")
#P"/Users/bar/foo.text"
上面的#p 确保在您回读它时会创建路径名对象(而不是字符串)。
? #P"/Users/bar/foo.text"
#P"/Users/bar/foo.text"
因此,Common Lisp 在内部使用路径名对象,但它允许您使用普通字符串并在需要时从它们生成路径名对象。
当 Common Lisp 看到一个没有指定所有组件的路径名(例如目录丢失)时,它会从路径名对象中填充组件,该对象是变量 *DEFAULT-PATHNAME-DEFAULTS* 的值。
使用 DESCRIBE 函数,您可以查看路径名的组成部分(此处为 Clozure CL):
? (describe (pathname "/Users/bar/*.text"))
#P"/Users/bar/*.text"
Type: PATHNAME
Class: #<BUILT-IN-CLASS PATHNAME>
TYPE: (PATHNAME . #<CCL::CLASS-WRAPPER PATHNAME #x3000401D03BD>)
%PATHNAME-DIRECTORY: (:ABSOLUTE "Users" "bar")
%PATHNAME-NAME: :WILD
%PATHNAME-TYPE: "text"
%PHYSICAL-PATHNAME-VERSION: :NEWEST
%PHYSICAL-PATHNAME-DEVICE: NIL
MAKE-PATHNAME 是函数,它需要几个关键字参数来指定组件。
有时根据现有路径名创建新路径名也很有用:
(make-pathname :name "foo" :defaults (pathname "/Users/bar/baz.text"))
如果您使用 DIRECTORY,则使用带有通配符的路径名很有用。 DIRECTORY 然后将返回匹配路径名的列表。 'DIRECTORY' 这个名字有点误导,因为 DIRECTORY 没有列出目录的内容,但列出了(通常)带有通配符的路径名的匹配路径名。通配符可以匹配组件中的字符序列,例如 /foo/s*c/list*.l*"。还有通配符 ** ,用于匹配目录层次结构的一部分,例如 /foo/** /test.lisp ,匹配目录 foo 及其子目录下的所有文件 test.lisp。
(directory "/Users/foo/Lisp/**/*.lisp")
上面应该返回 '/Users/foo/Lisp/' 及其所有子目录中所有 'lisp' 文件的列表。
要返回单个目录中的 .c 文件,请使用:
(directory "/Users/foo/c/src/*.c")
请注意,DIRECTORY 返回路径名对象列表(不是字符串列表)。
? (directory (make-pathname
:name "md5"
:type :wild
:directory '(:absolute "Lisp" "cl-http" "cl-http-342" "server")))
(#P"/Lisp/cl-http/cl-http-342/server/md5.lisp"
#P"/Lisp/cl-http/cl-http-342/server/md5.xfasl")
以上使用由 MAKE-PATHNAME 创建的路径名对象。它返回所有匹配 /Lisp/cl-http/cl-http-342/server/md5.* 的文件。
这与:
(directory "/Lisp/cl-http/cl-http-342/server/md5.*")
更短,但取决于 Unix 路径名语法。