【发布时间】:2017-01-06 13:26:04
【问题描述】:
我想在restart-case 期间向用户提供有关丢失输入文件的其他信息。
有没有可移植的方式打印当前目录下的文件?
【问题讨论】:
-
Uiop(包含在 ASDF 中)具有可移植的文件系统/操作系统实用程序。
(uiop/filesystem:directory-files (uiop/os:getcwd)).
标签: common-lisp
我想在restart-case 期间向用户提供有关丢失输入文件的其他信息。
有没有可移植的方式打印当前目录下的文件?
【问题讨论】:
(uiop/filesystem:directory-files (uiop/os:getcwd)).
标签: common-lisp
请查看File System Concepts,特别是directory。
例如,
(directory "~/*")获取您家中的文件列表,(directory "~/*/")获取你家的目录列表,(directory "~/**/*") 获取您家中所有子目录中所有文件的列表请注意,directory 可能会采用特定于实现的参数,例如 :full。
如果您正在使用asdf(您应该!),您可能想看看它附带的uiop。
PS。如果您的实现不支持在路径名中使用~ 来引用主目录,则可以改用user-homedir-pathname。
【讨论】:
对 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))))
【讨论】:
*QUERY-IO*(在READ-LINE 和之前的FORMAT 中)。这样开发环境(例如 SLIME/SLY)就可以理解这是一个提示。您还应该在它们之间放置一个(FINISH-OUTPUT *QUERY-IO*),以确保在尝试阅读任何内容之前打印提示。