确保存在用于读取的文件路径

时间:2013-05-06 10:56:58

标签: file elisp

我需要定义一个没有不必要的副作用的函数(即一个打开的缓冲区),确保文件存在,可以随时阅读。

这是我到目前为止所做的:

(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) ...)

但我真的不知道该怎么做。 :/


这是针对Emacs 新链接的 a Stack Exchange mode的全部内容:sx.el,顺便说一下: - )

1 个答案:

答案 0 :(得分: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)。