26.9.1 文件名组成部分

操作系统将文件分组存放于目录中。 要指定一个文件,必须同时指定目录及其在该目录下的文件名。 因此,Emacs 将文件名视为由两大部分组成: 目录名(directory name)部分与非目录(nondirectory)部分(即目录内文件名(file name within the directory))。 两部分均可为空。将两部分拼接即可还原原始文件名。 21

在大多数系统上,目录部分包含直至最后一个斜杠的所有内容 (MS-DOS 或 MS-Windows 输入中也允许使用反斜杠); 非目录部分为剩余内容。

在某些用途下,非目录部分会进一步拆分为主体名称与 版本号(version number)。在大多数系统上,只有备份文件的名称中包含版本号。

Function: file-name-directory filename

该函数返回 filename 的目录部分,格式为目录名(see 目录名); 若 filename 不包含目录部分,则返回 nil

在 GNU 及类 POSIX 系统上,该函数返回的字符串总是以斜杠结尾。 在 MS-DOS 上也可能以冒号结尾。

(file-name-directory "lewis/foo")  ; GNU example
     ⇒ "lewis/"
(file-name-directory "foo")        ; GNU example
     ⇒ nil
Function: file-name-nondirectory filename

该函数返回 filename 的非目录部分。

(file-name-nondirectory "lewis/foo")
     ⇒ "foo"
(file-name-nondirectory "foo")
     ⇒ "foo"
(file-name-nondirectory "lewis/")
     ⇒ ""
Function: file-name-sans-versions filename &optional keep-backup-version

该函数返回去除了文件版本号、备份版本号或末尾波浪号后的 filename

keep-backup-versionnil, 则返回值会丢弃文件系统识别的真实版本号,但保留备份版本号。

(file-name-sans-versions "~rms/foo.~1~")
     ⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo~")
     ⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo")
     ⇒ "~rms/foo"
Function: file-name-extension filename &optional period

该函数在对 filename 应用 file-name-sans-versions 去除版本/备份部分后,返回其最终扩展名(若有)。 文件名中的扩展名,是指最后一个名称组件中最后一个 ‘.’ 之后的部分(已去除版本/备份部分)。

对于无扩展名的文件名(如 foo),该函数返回 nil。 对于空扩展名(如 foo.),返回 ""。 若文件名最后一个组件以 ‘.’ 开头, 该 ‘.’ 不计为扩展名起始。 因此,.emacs 的扩展名为 nil,而非 ‘.emacs’。

periodnil, 返回值会包含分隔扩展名的点; 若 filename 无扩展名,则值为 ""

Function: file-name-with-extension filename extension

该函数返回将扩展名设置为 extension 后的 filenameextension 中开头的单个点会被自动去除。例如:

(file-name-with-extension "file" "el")
     ⇒ "file.el"
(file-name-with-extension "file" ".el")
     ⇒ "file.el"
(file-name-with-extension "file.c" "el")
     ⇒ "file.el"

注意:若 filenameextension 为空, 或 filename 格式为目录(即 directory-name-p 返回非 nil), 该函数会报错。

Function: file-name-sans-extension filename

该函数返回去除扩展名后的 filename(若有扩展名)。 若存在版本/备份部分,仅当文件有扩展名时才会将其移除。例如:

(file-name-sans-extension "foo.lose.c")
     ⇒ "foo.lose"
(file-name-sans-extension "big.hack/foo")
     ⇒ "big.hack/foo"
(file-name-sans-extension "/my/home/.emacs")
     ⇒ "/my/home/.emacs"
(file-name-sans-extension "/my/home/.emacs.el")
     ⇒ "/my/home/.emacs"
(file-name-sans-extension "~/foo.el.~3~")
     ⇒ "~/foo"
(file-name-sans-extension "~/foo.~3~")
     ⇒ "~/foo.~3~"

注意最后两个例子中的 ‘.~3~’ 是备份部分,并非扩展名。

Function: file-name-base filename

该函数等价于依次调用 file-name-sans-extensionfile-name-nondirectory。例如:

(file-name-base "/my/home/foo.c")
    ⇒ "foo"
Function: file-name-split filename

该函数将文件名拆分为组件列表, 可视为使用对应目录分隔符调用 string-join 的逆操作。例如:

(file-name-split "/tmp/foo.txt")
    ⇒ ("" "tmp" "foo.txt")
(string-join (file-name-split "/tmp/foo.txt") "/")
    ⇒ "/tmp/foo.txt"

Footnotes

(21)

Emacs 遵循 GNU 惯例,使用术语文件名(file name) 而非路径名(pathname)。我们仅将路径(path) 用于搜索路径,即目录名列表。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike