2013-05-06 44 views
0

我需要定義一個函數,它將在沒有不必要的副作用(即打開的緩衝區)的情況下確保文件已準備好可供讀取。確保文件路徑存在以供讀取

這是我到目前爲止有:

(defun ensure-existence (file) 
    (if (not (file-exists-p file)) 
    (kill-buffer 
    (save-buffer 
     (find-file-noselect file)))) 

這(似乎)時,該目錄存在做工精細。不幸的是,我不能確定是這種情況(因爲變量可能會發生變化等)。有沒有什麼辦法可以將make-directory納入所有這些,或者更好的解決方法是什麼?

我理想的使用情況是這樣的:

(ensure-existence "new/path/to/new/file.txt" 
    (func1 arg1) 
    (func2 arg2a arg2b) 
    (...)) 

這就需要有這樣的簽名:

(defun ensure-existence (file &rest body) ...) 

,但我真的不知道該怎麼做。 :/


這是所有a Stack Exchange mode爲Emacs新鏈接:sx.el,通過:-)

+0

我不確定我是否理解簽名'(file&rest body)'部分;我建議你就此提出一個單獨的問題。 – sds 2013-05-07 13:22:54

+0

@sds嗯......爲什麼? 'body'將是'file'後的所有內容。因此''(確保存在「foo.txt」(消息「文件存在」)(消息「不,實際上,它確實相信我」))'會設置'file =>「foo.txt」和' body =>'((message「...」)(message「...」))'然後可以用'mapc'和'eval'評估。 – 2013-06-01 14:31:38

+0

'&body'用於宏而不是函數。 – sds 2013-06-02 01:33:34

回答

3

至於建議由@Stefan的方式,

(defun ensure-file-exists (file) 
    (unless (file-exist-p file) 
    (make-directory (file-name-directory file) t) 
    (write-region "" nil file nil 'silent))) 

這應該工作在包括windows和unix。

編輯:實際上,你可以通過追加t參數write-region廢除該文件存在檢查,但如果它已經存在(就像touch),這將改變文件的修改時間。

只是爲了比較,Common Lisp的版本是這樣的:

(defun ensure-file-exists (file &key verbose) 
    (ensure-directories-exist foo :verbose verbose) 
    (open file :direction :probe :if-does-not-exist :create)) 

(見openensure-file-exists)。

+0

儘管UNIX系統上的所有內容都非常棒,但在Windows上無法使用。謝謝:) – 2013-05-06 12:25:50

+1

爲什麼使用'touch'時,你可以使用'(寫區域「」無無'沉默)'。 – Stefan 2013-05-06 13:05:33

+0

@Stefan:謝謝你的建議;現在它是便攜式! – sds 2013-05-06 13:22:15