【发布时间】:2012-04-16 08:46:07
【问题描述】:
谁能告诉我为什么 unix 不存储文件创建时间? 它存储修改时间,更改时间和访问时间而不是创建时间,对它来说是一个很大的负担吗? 有什么具体原因吗?
或者是通过使用某种语言(任何编程语言)和一些系统调用,我们可以通过某种方式获得文件创建时间吗?
【问题讨论】:
-
如果inode-data(如所有者、组模式等)没有改变,则可以使用“ctime”字段(如果存在)。
标签: unix
谁能告诉我为什么 unix 不存储文件创建时间? 它存储修改时间,更改时间和访问时间而不是创建时间,对它来说是一个很大的负担吗? 有什么具体原因吗?
或者是通过使用某种语言(任何编程语言)和一些系统调用,我们可以通过某种方式获得文件创建时间吗?
【问题讨论】:
标签: 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 */
};
【讨论】:
st_ctime,“上次状态更改的时间”,是获取出生时间的可靠方法吗?
st_ctime 记录 inode stat 结构发生变化(如文件大小或模式位)。 “c”表示状态 change,而不是文件 create.