26.6.4 文件属性

本节介绍用于获取文件详细信息的函数,包括所有者和组编号、链接数、索引节点(inode)编号、文件大小,以及访问时间和修改时间。

Function: file-newer-than-file-p filename1 filename2

若文件 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
Function: file-has-changed-p filename tag

若自上次调用该函数以来,文件 filename 的时间戳发生了变化,函数返回非 nil 值。 首次针对某个 filename 调用时,函数会记录文件的最后修改时间和大小;若文件存在,则返回非 nil。 后续针对同一 filename 调用时,会将当前时间戳和大小与记录的值对比,仅当时间戳或大小(或两者)发生变化时,才返回非 nil。 该函数适用于 Lisp 程序需要在文件发生变化时重新读取的场景。 可选参数 tag 必须是符号类型,指定后,仅会对比使用相同 tag 调用时记录的大小和修改时间。

Function: file-attributes filename &optional id-format

该函数返回文件 filename 的属性列表;若指定文件不存在,返回 nil。 该函数跟随符号链接。 可选参数 id-format 指定用户 ID(UID)和组 ID(GID)属性的首选格式(见下文)——有效值为 'string(字符串)和 'integer(整数)。后者为默认值,但我们计划修改这一默认设置;因此若你需要使用返回的 UID 或 GID,应显式为 id-format 指定非 nil 的值。

在 GNU 平台上操作本地文件时,该函数是原子操作:若文件系统被其他进程同时修改,函数会返回修改前或修改后的文件属性。 非原子场景下,若检测到竞争条件,函数可能返回 nil,或返回混合了修改前后状态的属性值。

系统提供了访问器函数用于读取该列表中的元素,下文介绍各元素时会同步提及对应的访问器。

属性列表的元素按顺序如下:

  1. 文件类型标识:目录返回 t,符号链接返回链接目标字符串,文本文件返回 nil (访问器:file-attribute-type)。
  2. 文件的链接数(即硬链接数量) (访问器:file-attribute-link-number)。 可通过 add-name-to-file 函数创建备用名称(即硬链接)(see 修改文件名与属性)。
  3. 文件的用户ID UID,通常为字符串形式 (访问器:file-attribute-user-id);若未对应命名用户,则返回整数。
  4. 文件的组ID GID,格式同上 (访问器:file-attribute-group-id)。
  5. 最后访问时间,以 Lisp 时间戳形式表示 (访问器:file-attribute-access-time)。 时间戳格式与 current-time 一致(see Time of Day),且会截断至文件系统的时间戳精度;例如部分 FAT 格式文件系统仅记录最后访问日期,因此该时间始终为最后访问当天的午夜。
  6. 最后修改时间,以 Lisp 时间戳形式表示 (访问器:file-attribute-modification-time)。 即文件内容最后被修改的时间。
  7. 最后状态变更时间,以 Lisp 时间戳形式表示 (访问器:file-attribute-status-change-time)。 即文件的访问权限位、所有者、所属组,以及文件系统中除内容外其他元信息最后变更的时间。
  8. 文件大小(字节数) (访问器:file-attribute-size)。
  9. 文件权限模式,由 10 个字母或短横线组成的字符串(格式同 ‘ls -l’ 输出) (访问器:file-attribute-modes)。
  10. 占位值,无实际意义,仅为向后兼容保留。
  11. 文件的索引节点(inode)编号,非负整数 (访问器:file-attribute-inode-number)。
  12. 文件所在设备的文件系统标识符,可为整数或两个整数组成的 cons 单元格 (访问器: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-listnil,该时间戳等价于 (1351023123050040152 . 1000000000)。)

(20000 23 0 0)

最后修改时间为 2001 年 7 月 15 日 世界协调时间(UTC)08:53:43.000000000。 (若 current-time-listnil,该时间戳等价于 (1310720023000000000 . 1000000000)。)

(20614 64555 902289 872000)

最后状态变更时间为 2012 年 10 月 23 日 世界协调时间(UTC)20:20:59.902289872。 (若 current-time-listnil,该时间戳等价于 (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

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike