为啥在其中创建新文件时目录的更改时间(ctime)会更改?

Posted

技术标签:

【中文标题】为啥在其中创建新文件时目录的更改时间(ctime)会更改?【英文标题】:Why does the change time(ctime) of a directory change when creating a new file in it?为什么在其中创建新文件时目录的更改时间(ctime)会更改? 【发布时间】:2020-06-07 20:42:16 【问题描述】:

根据documentation:

更改时间 (ctime) 这标志着文件的元数据何时更改, 例如权限或所有权。这也称为“更新” 一些文档中的时间。

然而,当我在目录中创建一个新文件并随后在该目录上运行 istat 命令时,我注意到目录的 ctime 又名“更新”时间已经改变。我认为只有更改目录的元数据才能更改 ctime?

【问题讨论】:

本文档不涵盖目录,仅涵盖常规文件。 @LorinczyZsigmond 关于目录的文档在哪里? 对不起,我不知道。顺便问一下,您希望解决的实际问题是什么? (参见:XY 问题) @LorinczyZsigmond 没有实际问题,我只是感到困惑。 从这里:unixtutorial.org/atime-ctime-mtime-in-unix-filesystems "ctime 显示您的文件或目录何时发生元数据更改 - 通常是文件所有权(用户名和/或组)和访问权限。如果文件内容,ctime 也会更新变了。”检查最后一句话。当您将新文件添加到目录时,您会修改目录内容。 【参考方案1】:

根据stat()系统调用规范:

stat() 函数应在写入 stat 结构之前更新任何与时间相关的字段(如 XBD 文件时间更新中所述)。

在对应的File Times Update文档中:

POSIX.1-2017 中读取或写入数据(即使数据未更改)或执行更改文件状态的操作(即使文件状态未更改)的每个函数或实用程序都指示哪个适当时间戳应标记为更新。

POSIX system calls 列表包含以下与在目录中创建对象相关的调用:

link()

成功完成后,link() 将标记更新文件的最后一个文件状态更改时间戳。此外,包含新条目的目录的最后一次数据修改和最后一次文件状态更改时间戳应标记为更新。

mkdir()

成功完成后,mkdir() 将标记更新目录的最后一次数据访问、最后一次数据修改和最后一次文件状态更改时间戳。此外,包含新条目的目录的最后一次数据修改和最后一次文件状态更改时间戳应标记为更新。

mkfifo()

成功完成后,mkfifo() 将标记更新文件的最后一次数据访问、最后一次数据修改和最后一次文件状态更改时间戳。此外,包含新条目的目录的最后一次数据修改和最后一次文件状态更改时间戳应标记为更新。

mknod()

成功完成后,mknod() 将标记更新文件的最后一次数据访问、最后一次数据修改和最后一次文件状态更改时间戳。此外,包含新条目的目录的最后一次数据修改和最后一次文件状态更改时间戳应标记为更新。

open()

如果设置了 O_CREAT 并且文件以前不存在,则在成功完成后,open() 将标记更新文件的最后一次数据访问、最后一次数据修改和最后一次文件状态更改时间戳以及最后一次数据修改和父目录的最后文件状态更改时间戳。

symlink()

成功完成后,symlink() 将标记更新符号链接的最后一次数据访问、最后一次数据修改和最后一次文件状态更改时间戳。此外,包含新条目的目录的最后一次数据修改和最后一次文件状态更改时间戳应标记为更新。

【讨论】:

好答案!我会欢迎更多的澄清,即 mknod 在您创建新文件时被调用。 用我能找到的与 open/create/make 相关的所有 POSIX 调用更新了答案。我不知道如何证明没有更多这样的系统调用,而不仅仅是查看这个长长的列表并自己确保:)【参考方案2】:

子目录列表包含在文件中,因此当您更新目录中的文件时,它会更新目录列表中该文件的元数据(mtime 等)。因此,子目录本身就是一个被修改过的文件。

【讨论】:

从迂腐的角度来说,目录就是文件。此外,问题不在于更新目录中的文件,而在于将文件添加到目录中,因此,正如您所说,需要修改目录文件本身以添加新条目给它。更新现有文件不应更改列出该现有文件的目录文件上的元数据。

以上是关于为啥在其中创建新文件时目录的更改时间(ctime)会更改?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的新用户无法在 SQL Developer 中创建新连接?

为啥 AS3 在 for 循环中创建新实例?

即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为啥?

WPF:为啥我的 ComboBox SelectedItem 不显示?

Prisma 在 MongoDB 中创建新数据库

在 Xcode 6 中创建新的资产目录/图像集