在dolist循环中获取子目录pathname-name返回nil,如何处理?
问题原因与解决办法
原因
Common Lisp的pathname-name函数是用来获取文件的名称,而非目录的最后一级名称。uiop:subdirectories返回的目录pathname对象,会把目录层级信息存在directory字段里,name字段自然为nil。
你直接调用(pathname-name "audio/bd")能得到"bd",是因为这个字符串被解析成了文件路径(哪怕实际是目录),此时"bd"被当作文件名处理;但uiop:subdirectories返回的是标准的目录pathname,结构上和文件pathname有明确区分。
解决办法
要获取目录的最后一级名称,有两种可靠方式:
- 提取
pathname-directory的最后一项:
(dolist (dir (uiop:subdirectories "audio")) (print (car (last (pathname-directory dir)))))
- 用UIOP自带的
uiop:basename函数(专门处理路径最后部分,兼容文件和目录):
(dolist (dir (uiop:subdirectories "audio")) (print (uiop:basename dir)))
以上两种方式都能正确输出子目录名称,比如"aliinaMay23"、"bd"等。
内容的提问来源于stack exchange,提问作者kflak
相关产品推荐
相关产品推荐

