26.9.5 生成唯一文件名

有些程序需要写入临时文件。为这类文件构造名称的常用方式如下:

(make-temp-file name-of-application)

make-temp-file 的作用是避免两个不同用户或两个不同任务试图使用完全相同的文件名。

Function: make-temp-file prefix &optional dir-flag suffix text

该函数创建一个临时文件并返回其名称。Emacs 会在 prefix 后追加若干随机字符生成临时文件名,每次运行 Emacs 时生成的字符都不同。返回的名称一定对应一个新建文件;如果以字符串形式提供了 text,文件会包含该内容,否则为空。在 MS-DOS 上,该函数可能会截断 prefix 以适应 8+3 文件名限制。如果 prefix 是相对文件名,会基于 temporary-file-directory 进行展开。

(make-temp-file "foo")
     ⇒ "/tmp/foo232J6v"

make-temp-file 返回时,文件已经创建且为空。此时你应当向文件中写入预期内容。

如果 dir-flagnilmake-temp-file 会创建一个空目录而非空文件。它返回的是该目录的文件名,而非目录名。See 目录名

如果 suffixnilmake-temp-file 会将其追加到文件名末尾。

如果 text 是字符串,make-temp-file 会将其插入文件中。

为避免同一 Emacs 中不同库之间产生冲突,每个使用 make-temp-file 的 Lisp 程序都应使用自己的 prefix。追加在 prefix 后的数字用于区分在不同 Emacs 进程中运行的同一应用。额外追加的字符可保证在单个 Emacs 进程内也能生成大量不同名称。

临时文件的默认目录由变量 temporary-file-directory 控制。该变量为用户提供了统一指定所有临时文件目录的方式。部分程序在 small-temporary-file-directorynil 时会改用该目录。使用时应在调用 make-temp-file 之前,先将前缀在对应目录下展开。

User Option: temporary-file-directory

该变量指定用于创建临时文件的目录名。其值应为目录名(see 目录名),但 Lisp 程序最好能兼容传入目录文件名的情况。将其作为 expand-file-name 的第二个参数是实现这一点的好方法。

默认值根据操作系统合理设定;它基于 TMPDIRTMPTEMP 环境变量,如果这些变量均未定义,则回退到系统默认目录名。

即使你不使用 make-temp-file 创建临时文件,也应使用该变量决定将文件放在哪个目录下。不过,如果你预计文件会很小,应优先使用非 nilsmall-temporary-file-directory

User Option: small-temporary-file-directory

该变量指定用于创建某些大概率体积较小的临时文件的目录名。

如果你要写入一个大概率很小的临时文件,应按如下方式确定目录:

(make-temp-file
  (expand-file-name prefix
                    (or small-temporary-file-directory
                        temporary-file-directory)))
Function: make-temp-name base-name

该函数生成一个可能唯一的文件名字符串。名称以 base-name 开头,并追加若干随机字符,每次 Emacs 运行时都不同。它与 make-temp-file 类似,区别在于:(i) 它只构造名称而不创建文件;(ii) base-name 应为非魔法格式的绝对文件名;(iii) 如果返回的文件名是魔法格式,它可能指向一个已存在的文件。See 实现“魔法”文件名机制

警告:大多数情况下不应使用该函数,而应使用 make-temp-file!该函数存在竞态条件问题,即在 make-temp-name 调用与文件创建之间可能被利用,在某些场景下会引发安全漏洞。

有时需要在远程主机或挂载目录上创建临时文件。下面两个函数支持这一场景。

Function: make-nearby-temp-file prefix &optional dir-flag suffix

该函数与 make-temp-file 类似,但会尽可能在靠近 default-directory 的位置创建临时文件。如果 prefix 是相对文件名,且 default-directory 是远程文件名或位于挂载文件系统上,则临时文件会创建在函数 temporary-file-directory 返回的目录中。否则直接使用 make-temp-fileprefixdir-flagsuffix 的含义与 make-temp-file 中一致。

(let ((default-directory "/ssh:remotehost:"))
  (make-nearby-temp-file "foo"))
     ⇒ "/ssh:remotehost:/tmp/foo232J6v"
Function: temporary-file-directory

通过 make-nearby-temp-file 写入临时文件所用的目录。如果 default-directory 是远程路径,则返回对应远程主机上的临时文件目录。如果该目录不存在,或 default-directory 位于挂载文件系统(参见 mounted-file-systems),则函数返回 default-directory。对于非远程、非挂载的 default-directory,返回变量 temporary-file-directory 的值。

要提取临时文件名的本地部分,可使用 file-local-name(see 实现“魔法”文件名机制)。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike