2017-01-06 47 views
1

我想在缺少輸入文件的restart-case期間向用戶提供更多信息。便攜式顯示當前目錄的內容

有沒有便攜的方式來打印出當前目錄中的文件?

+1

Uiop(包含在ASDF中)具有可移植的文件系統/ os實用程序。 '(uiop/filesystem:目錄文件(uiop/os:getcwd))'。 – jkiiski

回答

3

請看看File System Concepts,特別是在directory

例如,

  • 使用(directory "~/*")讓您家中的文件列表,
  • 使用(directory "~/*/")讓你的家目錄列表,
  • (directory "~/**/*")得到所有的列表文件在您家中的所有子目錄中

請注意,directory可能需要特定於實現的參數,如:full

如果你正在使用asdf(你應該!),你可能想看看它附帶的uiop

PS。如果您的實現不支持路徑名中的~來引用主目錄,則可以使用user-homedir-pathname來代替。

+1

請注意,作爲Homedirectory的路徑名中的Tilde是特定於實現的,但我期望所有基於Unix/Linux的實現都能支持它。 –

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)))) 
+1

在提示新文件時(在READ-LINE和FORMAT之前),您應該使用'* QUERY-IO *'。這樣開發環境(比如SLIME/SLY)可以理解這是一個提示。您還應該在它們之間放置一個'(FINISH-OUTPUT * QUERY-IO *)',以確保在嘗試讀取任何內容之前打印提示。 – jkiiski

+0

通常您不會以遞歸方式調用讀取文件,而是使用圍繞重新啓動情況表單的循環。 –

+0

@RainerJoswig你能否給出一些背景信息,爲什麼要在這裏避免遞歸? –