以便携方式显示当前目录的内容

时间:2017-01-06 13:26:04

标签: common-lisp

我希望在restart-case期间为用户提供有关缺少输入文件的其他信息。

是否有可移植的方式打印出当前目录中的文件?

2 个答案:

答案 0 :(得分:3)

请查看File System Concepts,特别是directory

,例如,

  • 使用(directory "~/*")获取您家中的文件列表
  • 使用(directory "~/*/")获取您家中的目录列表
  • (directory "~/**/*")获取您家中所有子目录中所有文件的列表

请注意,directory可能会采用特定于实现的参数,例如:full

如果您使用asdf(您应该!),您可能需要查看随附的uiop

PS。如果您的实现不支持路径名中的~来引用主目录,则可以使用user-homedir-pathname代替。

答案 1 :(得分:1)

对uiop的引用是我需要的提示。这就是我现在在我的测试用例中使用的,它对我来说非常有用:

 (defun file-is-missing ()
  (let* ((cwd (uiop:getcwd))
         (files (uiop:directory-files cwd)))
    (format t "~&Current directory: ~a~%" cwd)
    (dolist (file files)
      (format t "~&~3T~a" file))
    (format t "~&Provide new file: ")
    (list (read-line))))

(defun read-file (file)
  (restart-case
      (with-open-file (s file :direction :input :if-does-not-exist :error)
        (do ((l (read-line s) (read-line s nil 'eof)))
            ((eq l 'eof) "Reached end of file.")
          (format t "~&*** ~A~%" l)))
    (New-File (filename)
      :interactive file-is-missing
      (read-file filename))))