3

anybvody 可以告诉我为什么 unix 不存储文件创建时间吗?它存储修改时间,更改时间和访问时间而不是创建时间,对它来说是一个很大的负担吗?有什么具体原因吗?

还是通过使用某种语言(任何编程语言)和一些系统调用,我们可以如何获得文件创建时间?

4

4 回答 4

5

我相信这样的信息是 inode 存储的责任,因此是文件系统本身的限制。快速搜索一下,发现 ext4 文件系统在其 inode 中为该文件属性添加了存储。

ext4 时间戳

于 2012-04-16T08:58:34.070 回答
3

Unix 不存储创建时间的主要原因是这个信息是有争议的,因为对于文件创建日期应该设置什么没有标准定义。

有些人希望这个创建时间代表数据的创建时间(例如:拍摄 jpeg 照片),因此在从备份复制或恢复文件时保留。另一方面,其他一些人更喜欢这个创建时间是创建文件系统对象(例如:inode)的时间。

前者完成后,通常出现在文件中(例如:EXIF)。

后者是最近的文件系统提供的:

  • UFS2 / st_birthtime
  • ZFS/crtime
  • ext4/crtime
  • btrfs / 时间
  • 高频+ / ?

请注意,没有协议命名用于存储此创建时间的字段。

于 2012-04-16T10:13:12.897 回答
1

正如WhiteboardDev所指出的,许多现代文件系统确实存储了文件创建时间,但它不是标准的,因此访问细节的方法会有所不同。

至于它的具体原因,基本上是历史原因。在 70 年代首次定义这些 API 时,存储太多元数据确实是一种负担。(值得注意的是,当前的文件系统并不总是更新“最后访问时间”,因为是负担......)

于 2012-04-16T09:12:49.507 回答
1

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 */
       };
于 2012-04-16T09:13:06.193 回答