【问题标题】:Portable way to show the contents of the current directory显示当前目录内容的便携方式
【发布时间】:2017-01-06 13:26:04
【问题描述】:

我想在restart-case 期间向用户提供有关丢失输入文件的其他信息。

有没有可移植的方式打印当前目录下的文件?

【问题讨论】:

  • Uiop(包含在 ASDF 中)具有可移植的文件系统/操作系统实用程序。 (uiop/filesystem:directory-files (uiop/os:getcwd)).

标签: common-lisp


【解决方案1】:

请查看File System Concepts,特别是directory

例如,

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

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

如果您正在使用asdf(您应该!),您可能想看看它附带的uiop

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

【讨论】:

  • 请注意,作为主目录的路径名中的波浪号是特定于实现的,尽管我希望所有基于 Unix/Linux 的实现都支持它。
【解决方案2】:

对 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*),以确保在尝试阅读任何内容之前打印提示。
  • 通常你不会递归调用 read-file ,而是在重启案例表单周围使用循环。
  • @RainerJoswig 您能否提供一些背景信息,为什么要在这里避免递归?
  • 如果没有 TCO,您将在堆栈上多次调用 READ-FILE,以防多次调用重启...
猜你喜欢
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
相关资源
最近更新 更多