26.6.1 测试文件可访问性

这些函数用于测试访问文件的权限,包括读取、写入或执行权限。除非另有明确说明,否则它们会跟随符号链接。See 区分文件类型

在部分操作系统中,可通过访问控制列表(ACL)等机制配置更复杂的访问权限集。 有关如何查询和设置这些权限的方法,详见 See 文件扩展属性

Function: file-exists-p filename

若名为 filename 的文件看似存在,该函数返回 t。这仅表示你大概率能获取文件属性,而非一定能读取文件内容。 (在 GNU 及其他类 POSIX 系统中,只要文件存在且你拥有其所在目录的执行权限,无论文件自身权限如何,该函数均返回 t。)

若文件不存在,或无法确定文件是否存在,该函数返回 nil

空字符串文件名会被解析为相对于当前缓冲区的默认目录(see 绝对文件名与相对文件名),因此向 file-exists-p 传入空字符串时,实际检测的是缓冲区默认目录的存在性。

目录本质上也是文件,因此向 file-exists-p 传入目录名时可能返回 t。但由于该函数会跟随符号链接,仅当链接目标存在时,符号链接名才会返回 t; 若你的 Lisp 程序需要将目标不存在的悬空符号链接(dangling symlinks)视为已存在的文件,请使用 file-attributes(see 文件属性)而非 file-exists-p

Function: file-readable-p filename

若名为 filename 的文件存在且你拥有读取权限,该函数返回 t;否则返回 nil

Function: file-executable-p filename

若名为 filename 的文件存在且你拥有执行权限,该函数返回 t;否则返回 nil。 在 GNU 及其他类 POSIX 系统中,若文件是目录,执行权限意味着你可检查目录内文件的存在性和属性,且在文件自身权限允许的情况下打开这些文件。

Function: file-writable-p filename

若你可写入或创建文件 filename,该函数返回 t;否则返回 nil。 文件可写的条件:文件已存在且你拥有写入权限;文件不存在但其父目录存在且你拥有该目录的写入权限(即可创建文件)。

下述示例中,foo 不可写,原因是其父目录不存在——即便用户有权创建该目录,函数仍返回 nil

(file-writable-p "~/no-such-dir/foo")
     ⇒ nil
Function: file-accessible-directory-p dirname

若你拥有打开目录 dirname 内已有文件的权限,该函数返回 t;否则(如目录不存在)返回 nil。 参数 dirname 可以是目录名(如 /foo/),也可以是目录对应的文件名(如 /foo,无末尾斜杠)。

例如,从以下结果可推断:尝试读取 /foo/ 内的任何文件都会触发错误:

(file-accessible-directory-p "/foo")
     ⇒ nil
Macro: with-existing-directory body…

该宏确保在执行 body 中的表达式前,default-directory 已绑定到一个已存在的目录。 若 default-directory 本身已存在,则优先使用;否则会选用其他已存在的目录。 该宏适用于调用要求运行目录必须存在的外部命令等场景,但不保证所选目录可写。

Function: access-file filename string

若你可读取 filename,该函数返回 nil;否则抛出错误,错误提示文本为 string

若用户选项 remote-file-name-access-timeout 设为正数,当函数执行时间超过该值(单位:秒)时会抛出错误。 该限制仅适用于远程文件,且不计入读取密码等额外耗时。

Function: file-ownership-preserved-p filename &optional group

若删除文件 filename 后重新创建,其所有者保持不变,该函数返回 t;对于不存在的文件,同样返回 t

若可选参数 groupnil,该函数还会检查文件的所属组是否保持不变。

该函数跟随符号链接。

Function: file-modes filename &optional flag

该函数返回文件 filename模式位(mode bits)——即汇总文件读、写、执行权限的整数。 该函数默认跟随符号链接;若文件不存在,返回值为 nil

有关模式位的详细说明,详见 See File permissions in The GNU Coreutils Manual。 例如,最低位为 1 表示所有用户均可执行该文件;次低位为 1 表示所有用户均可写入该文件,依此类推。 模式位的最大值为 4095(八进制 7777),表示所有人拥有读、写、执行权限,同时为其他用户和组设置了 SetUID 位,且设置了粘滞位。

默认情况下该函数跟随符号链接;但若可选参数 flag 为符号 nofollow,则当 filename 是符号链接时不跟随, 这可避免意外获取其他位置文件的模式位,且与 file-attributes(see 文件属性)的行为更一致。

有关设置文件权限的方法,详见 See 修改文件名与属性 中的 set-file-modes 函数。

(file-modes "~/junk/diffs" 'nofollow)
     ⇒ 492               ; Decimal integer.
(format "%o" 492)
     ⇒ "754"             ; Convert to octal.

(set-file-modes "~/junk/diffs" #o666 'nofollow)
     ⇒ nil

$ ls -l diffs
-rw-rw-rw- 1 lewis lewis 3063 Oct 30 16:00 diffs

MS-DOS 说明:MS-DOS 系统无“可执行文件模式位”概念。因此 file-modes 会根据文件名后缀判断文件是否可执行—— 若后缀为 .com.bat.exe 等标准可执行扩展名,则视为可执行文件; 以 POSIX 标准 ‘#!’ 开头的文件(如 Shell 脚本、Perl 脚本)也被视为可执行; 为兼容 POSIX,目录同样会被标记为可执行。file-attributes(see 文件属性)也遵循这些约定。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike