我需要定义一个没有不必要的副作用的函数(即一个打开的缓冲区),确保文件存在,可以随时阅读。
这是我到目前为止所做的:
(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
,顺便说一下: - )
答案 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))
(请参阅open
和ensure-file-exists
)。