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

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


这都是为了Emacs的堆栈交换模式新链接:sx.el顺便说一句:-)

4

1 回答 1

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)。

于 2013-05-06T12:18:22.533 回答