26.9.2 绝对文件名与相对文件名

文件系统中的所有目录构成一棵从根目录开始的目录树。 文件名可以从树的根节点开始指定全部目录名称, 这样的名称称为绝对(absolute)文件名。 文件名也可以指定文件相对于某个默认目录在目录树中的位置, 这样的名称称为相对(relative)文件名。

在 GNU 及类 POSIX 系统上,在对开头的 ‘~’ 完成展开后, 绝对文件名以 ‘/’ 开头(see abbreviate-file-name), 而相对文件名则不是。 在 MS-DOS 和 MS-Windows 上,绝对文件名以斜杠或反斜杠开头, 或以驱动器格式 ‘x:/’ 开头,其中 x驱动器号(drive letter)

Function: file-name-absolute-p filename

若文件名 filename 为绝对文件名,该函数返回 t, 否则返回 nil。 满足以下条件的文件名会被视为绝对文件名: 其第一个组件为 ‘~’, 或为 ‘~user’ 且 user 为有效登录用户名。

以下示例假设存在用户 ‘rms’,但不存在用户 ‘nosuchuser’。

(file-name-absolute-p "~rms/foo")
     ⇒ t
(file-name-absolute-p "~nosuchuser/foo")
     ⇒ nil
(file-name-absolute-p "rms/foo")
     ⇒ nil
(file-name-absolute-p "/user/rms/foo")
     ⇒ t

对于一个可能为相对路径的文件名, 你可以使用 expand-file-name 展开开头的 ‘~’ 并将结果转为绝对文件名(see 文件名展开相关函数)。 下面这个函数则用于将绝对文件名转为相对文件名:

Function: file-relative-name filename &optional directory

该函数尝试返回一个与 filename 等价的相对名称, 假定该结果将相对于 directory(一个绝对目录名或目录文件名)进行解析。 若 directory 省略或为 nil,则默认为当前缓冲区的默认目录。

在部分操作系统中,绝对文件名以设备名开头。 在这类系统上,如果 filenamedirectory 以不同设备名开头,则不存在基于 directory 的等价相对路径, 此时 file-relative-name 会直接返回绝对形式的 filename

(file-relative-name "/foo/bar" "/foo/")
     ⇒ "bar"
(file-relative-name "/foo/bar" "/hack/")
     ⇒ "../foo/bar"

空字符串形式的文件名代表当前缓冲区的默认目录。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike