文件系统中的所有目录构成一棵从根目录开始的目录树。 文件名可以从树的根节点开始指定全部目录名称, 这样的名称称为绝对(absolute)文件名。 文件名也可以指定文件相对于某个默认目录在目录树中的位置, 这样的名称称为相对(relative)文件名。
在 GNU 及类 POSIX 系统上,在对开头的 ‘~’ 完成展开后, 绝对文件名以 ‘/’ 开头(see abbreviate-file-name), 而相对文件名则不是。 在 MS-DOS 和 MS-Windows 上,绝对文件名以斜杠或反斜杠开头, 或以驱动器格式 ‘x:/’ 开头,其中 x 为驱动器号(drive letter)。
若文件名 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 文件名展开相关函数)。
下面这个函数则用于将绝对文件名转为相对文件名:
该函数尝试返回一个与 filename 等价的相对名称,
假定该结果将相对于 directory(一个绝对目录名或目录文件名)进行解析。
若 directory 省略或为 nil,则默认为当前缓冲区的默认目录。
在部分操作系统中,绝对文件名以设备名开头。
在这类系统上,如果 filename 与 directory
以不同设备名开头,则不存在基于 directory 的等价相对路径,
此时 file-relative-name 会直接返回绝对形式的 filename。
(file-relative-name "/foo/bar" "/foo/")
⇒ "bar"
(file-relative-name "/foo/bar" "/hack/")
⇒ "../foo/bar"
空字符串形式的文件名代表当前缓冲区的默认目录。