anybvody 可以告诉我为什么 unix 不存储文件创建时间吗?它存储修改时间,更改时间和访问时间而不是创建时间,对它来说是一个很大的负担吗?有什么具体原因吗?
还是通过使用某种语言(任何编程语言)和一些系统调用,我们可以如何获得文件创建时间?
anybvody 可以告诉我为什么 unix 不存储文件创建时间吗?它存储修改时间,更改时间和访问时间而不是创建时间,对它来说是一个很大的负担吗?有什么具体原因吗?
还是通过使用某种语言(任何编程语言)和一些系统调用,我们可以如何获得文件创建时间?
我相信这样的信息是 inode 存储的责任,因此是文件系统本身的限制。快速搜索一下,发现 ext4 文件系统在其 inode 中为该文件属性添加了存储。
Unix 不存储创建时间的主要原因是这个信息是有争议的,因为对于文件创建日期应该设置什么没有标准定义。
有些人希望这个创建时间代表数据的创建时间(例如:拍摄 jpeg 照片),因此在从备份复制或恢复文件时保留。另一方面,其他一些人更喜欢这个创建时间是创建文件系统对象(例如:inode)的时间。
前者完成后,通常出现在文件中(例如:EXIF)。
后者是最近的文件系统提供的:
请注意,没有协议命名用于存储此创建时间的字段。
正如WhiteboardDev所指出的,许多现代文件系统确实存储了文件创建时间,但它不是标准的,因此访问细节的方法会有所不同。
至于它的具体原因,基本上是历史原因。在 70 年代首次定义这些 API 时,存储太多元数据确实是一种负担。(值得注意的是,当前的文件系统并不总是更新“最后访问时间”,因为那是负担......)
stat 将返回修改更改 st_ctime 一旦文件被修改或它的所有者更改它的出处更改,所以所有的赌注都在内容上 dos/nt 在这方面是不可靠的,因为你可以完全丢弃文件,在命令中将其全部重写shell 和创建时间不会改变
与 unix 中的文件关联的元数据不保证原始创建时间,但保留最新版本的创建时间。如果您需要对文件进行版本控制,则应在外部或内部明确版本
字段 st_ctime 通过写入或设置 inode 信息(即所有者、组、链接计数、模式等)来更改。
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};