这些函数用于测试访问文件的权限,包括读取、写入或执行权限。除非另有明确说明,否则它们会跟随符号链接。See 区分文件类型。
在部分操作系统中,可通过访问控制列表(ACL)等机制配置更复杂的访问权限集。 有关如何查询和设置这些权限的方法,详见 See 文件扩展属性。
若名为 filename 的文件看似存在,该函数返回 t。这仅表示你大概率能获取文件属性,而非一定能读取文件内容。
(在 GNU 及其他类 POSIX 系统中,只要文件存在且你拥有其所在目录的执行权限,无论文件自身权限如何,该函数均返回 t。)
若文件不存在,或无法确定文件是否存在,该函数返回 nil。
空字符串文件名会被解析为相对于当前缓冲区的默认目录(see 绝对文件名与相对文件名),因此向 file-exists-p 传入空字符串时,实际检测的是缓冲区默认目录的存在性。
目录本质上也是文件,因此向 file-exists-p 传入目录名时可能返回 t。但由于该函数会跟随符号链接,仅当链接目标存在时,符号链接名才会返回 t;
若你的 Lisp 程序需要将目标不存在的悬空符号链接(dangling symlinks)视为已存在的文件,请使用 file-attributes(see 文件属性)而非 file-exists-p。
若名为 filename 的文件存在且你拥有读取权限,该函数返回 t;否则返回 nil。
若名为 filename 的文件存在且你拥有执行权限,该函数返回 t;否则返回 nil。
在 GNU 及其他类 POSIX 系统中,若文件是目录,执行权限意味着你可检查目录内文件的存在性和属性,且在文件自身权限允许的情况下打开这些文件。
若你可写入或创建文件 filename,该函数返回 t;否则返回 nil。
文件可写的条件:文件已存在且你拥有写入权限;文件不存在但其父目录存在且你拥有该目录的写入权限(即可创建文件)。
下述示例中,foo 不可写,原因是其父目录不存在——即便用户有权创建该目录,函数仍返回 nil。
(file-writable-p "~/no-such-dir/foo")
⇒ nil
若你拥有打开目录 dirname 内已有文件的权限,该函数返回 t;否则(如目录不存在)返回 nil。
参数 dirname 可以是目录名(如 /foo/),也可以是目录对应的文件名(如 /foo,无末尾斜杠)。
例如,从以下结果可推断:尝试读取 /foo/ 内的任何文件都会触发错误:
(file-accessible-directory-p "/foo")
⇒ nil
该宏确保在执行 body 中的表达式前,default-directory 已绑定到一个已存在的目录。
若 default-directory 本身已存在,则优先使用;否则会选用其他已存在的目录。
该宏适用于调用要求运行目录必须存在的外部命令等场景,但不保证所选目录可写。
若你可读取 filename,该函数返回 nil;否则抛出错误,错误提示文本为 string。
若用户选项 remote-file-name-access-timeout 设为正数,当函数执行时间超过该值(单位:秒)时会抛出错误。
该限制仅适用于远程文件,且不计入读取密码等额外耗时。
若删除文件 filename 后重新创建,其所有者保持不变,该函数返回 t;对于不存在的文件,同样返回 t。
若可选参数 group 非 nil,该函数还会检查文件的所属组是否保持不变。
该函数不跟随符号链接。
该函数返回文件 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 文件属性)也遵循这些约定。