26.6.2 区分文件类型

本节介绍如何区分不同类型的文件,例如目录、符号链接和普通文件。

符号链接在大多数场景下都会被自动解析(跟随)。例如解析文件名 a/b/c 时,aa/ba/b/c 中的任意一个都可能是会被解析的符号链接,若链接目标本身也是符号链接,还可能递归解析。 但有少数函数不会解析文件名末尾的符号链接(如本例中的 a/b/c),这类函数被称为不跟随符号链接(not follow symbolic links)

若文件 filename 是符号链接,该函数不会解析它,而是以字符串形式返回其链接目标。 (链接目标字符串不一定是目标文件的完整绝对路径;要确定链接指向的完整路径并非易事,详见下文。)

若文件 filename 不是符号链接、不存在,或无法确定其是否为符号链接,file-symlink-p 返回 nil

以下是该函数的使用示例:

(file-symlink-p "not-a-symlink")
     ⇒ nil
(file-symlink-p "sym-link")
     ⇒ "not-a-symlink"
(file-symlink-p "sym-link2")
     ⇒ "sym-link"
(file-symlink-p "/bin")
     ⇒ "/pub/bin"

注意第三个示例中,函数仅返回 sym-link,并未继续解析该文件(尽管它本身也是符号链接)。 这是因为该函数不跟随符号链接——符号链接解析过程不会作用于文件名的最后一个组成部分。

该函数返回的字符串是符号链接中记录的原始内容,可能包含或不包含前缀目录。 该函数不会将链接目标展开为全限定路径;尤其当链接目标不是绝对路径时,不会将 filename 参数中的前缀目录(若有)拼接到目标前。示例如下:

(file-symlink-p "/foo/bar/baz")
     ⇒ "some-file"

本例中,尽管传入的是全限定路径 /foo/bar/baz,但返回结果并非全路径,甚至完全没有前缀目录。 且由于 some-file 本身也可能是符号链接,你无法简单地为其添加前缀目录,也不能直接使用 expand-file-name(see 文件名展开相关函数)生成其绝对路径。

因此,若你仅需判断文件是否为符号链接,该函数适用;若需要获取链接目标的完整文件名,应使用 真实路径 中介绍的 file-chase-linksfile-truename

Function: file-directory-p filename

filename 是已存在目录的名称,该函数返回 t;若 filename 不是目录名、目录不存在,或无法确定其是否为目录,则返回 nil。 该函数会跟随符号链接。

(file-directory-p "~rms")
     ⇒ t
(file-directory-p "~rms/lewis/files.texi")
     ⇒ nil
(file-directory-p "~rms/lewis/no-such-file")
     ⇒ nil
(file-directory-p "$HOME")
     ⇒ nil
(file-directory-p
 (substitute-in-file-name "$HOME"))
     ⇒ t
Function: file-regular-p filename

若文件 filename 存在且为普通文件(非目录、命名管道、终端或其他 I/O 设备),该函数返回 t; 若文件不存在、非普通文件,或无法确定其是否为普通文件,则返回 nil。 该函数会跟随符号链接。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike