本节介绍用于获取文件详细信息的函数,包括所有者和组编号、链接数、索引节点(inode)编号、文件大小,以及访问时间和修改时间。
若文件 filename1 比文件 filename2 新,该函数返回 t。
若 filename1 不存在,返回 nil;若 filename1 存在但 filename2 不存在,返回 t;否则比较两个文件的最后修改时间。
以下示例中,假设 aug-19 是 19 号写入的文件,aug-20 是 20 号写入的文件,而 no-file 完全不存在:
(file-newer-than-file-p "aug-19" "aug-20")
⇒ nil
(file-newer-than-file-p "aug-20" "aug-19")
⇒ t
(file-newer-than-file-p "aug-19" "no-file")
⇒ t
(file-newer-than-file-p "no-file" "aug-19")
⇒ nil
若自上次调用该函数以来,文件 filename 的时间戳发生了变化,函数返回非 nil 值。
首次针对某个 filename 调用时,函数会记录文件的最后修改时间和大小;若文件存在,则返回非 nil。
后续针对同一 filename 调用时,会将当前时间戳和大小与记录的值对比,仅当时间戳或大小(或两者)发生变化时,才返回非 nil。
该函数适用于 Lisp 程序需要在文件发生变化时重新读取的场景。
可选参数 tag 必须是符号类型,指定后,仅会对比使用相同 tag 调用时记录的大小和修改时间。
该函数返回文件 filename 的属性列表;若指定文件不存在,返回 nil。
该函数不跟随符号链接。
可选参数 id-format 指定用户 ID(UID)和组 ID(GID)属性的首选格式(见下文)——有效值为 'string(字符串)和 'integer(整数)。后者为默认值,但我们计划修改这一默认设置;因此若你需要使用返回的 UID 或 GID,应显式为 id-format 指定非 nil 的值。
在 GNU 平台上操作本地文件时,该函数是原子操作:若文件系统被其他进程同时修改,函数会返回修改前或修改后的文件属性。
非原子场景下,若检测到竞争条件,函数可能返回 nil,或返回混合了修改前后状态的属性值。
系统提供了访问器函数用于读取该列表中的元素,下文介绍各元素时会同步提及对应的访问器。
属性列表的元素按顺序如下:
t,符号链接返回链接目标字符串,文本文件返回 nil
(访问器:file-attribute-type)。
file-attribute-link-number)。
可通过 add-name-to-file 函数创建备用名称(即硬链接)(see 修改文件名与属性)。
file-attribute-user-id);若未对应命名用户,则返回整数。
file-attribute-group-id)。
file-attribute-access-time)。
时间戳格式与 current-time 一致(see Time of Day),且会截断至文件系统的时间戳精度;例如部分 FAT 格式文件系统仅记录最后访问日期,因此该时间始终为最后访问当天的午夜。
file-attribute-modification-time)。
即文件内容最后被修改的时间。
file-attribute-status-change-time)。
即文件的访问权限位、所有者、所属组,以及文件系统中除内容外其他元信息最后变更的时间。
file-attribute-size)。
file-attribute-modes)。
file-attribute-inode-number)。
file-attribute-device-number)。
后者常用于远程文件,以区分远程文件系统和本地文件系统。
文件的索引节点和设备编号组合可唯一标识系统中的任意文件—不存在两个文件的这两个属性值完全相同。
file-attribute-file-identifier 函数会返回这个唯一标识文件的元组。
例如,以下是文件 files.texi 的属性示例:
(file-attributes "files.texi" 'string)
⇒ (nil 1 "lh" "users"
(20614 64019 50040 152000)
(20000 23 0 0)
(20614 64555 902289 872000)
122295 "-rw-rw-rw-"
t 6473924464520138
1014478468)
该结果的解读如下:
nil既非目录也非符号链接。
1仅有一个名称(即当前默认目录下的 files.texi)。
"lh"所有者为用户 ‘lh’。
"users"所属组为 ‘users’。
(20614 64019 50040 152000)最后访问时间为 2012 年 10 月 23 日 世界协调时间(UTC)20:12:03.050040152。
(若 current-time-list 为 nil,该时间戳等价于 (1351023123050040152 . 1000000000)。)
(20000 23 0 0)最后修改时间为 2001 年 7 月 15 日 世界协调时间(UTC)08:53:43.000000000。
(若 current-time-list 为 nil,该时间戳等价于 (1310720023000000000 . 1000000000)。)
(20614 64555 902289 872000)最后状态变更时间为 2012 年 10 月 23 日 世界协调时间(UTC)20:20:59.902289872。
(若 current-time-list 为 nil,该时间戳等价于 (1351023659902289872 . 1000000000)。)
122295文件大小为 122295 字节。 (但文件中的字符数可能不足 122295——若部分字节属于多字节序列,或行尾格式为回车-换行(CR-LF)。)
"-rw-rw-rw-"权限模式为所有者、所属组、其他用户均拥有读写权限。
t仅为占位值,无实际信息。
6473924464520138索引节点编号为 6473924464520138。
1014478468所在文件系统的设备编号为 1014478468。
该函数返回文件 filename 的链接数(即硬链接数量);若文件不存在,返回 nil。
注意符号链接不影响该函数结果——符号链接不被视为其指向文件的名称。
该函数不跟随符号链接。
$ ls -l foo* -rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo -rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo1
(file-nlinks "foo")
⇒ 2
(file-nlinks "doesnt-exist")
⇒ nil