unix中的文件创建时间

时间:2012-04-16 08:46:07

标签: unix

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

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

4 个答案:

答案 0 :(得分:5)

我认为像这样的信息是inode存储的责任,因此也是文件系统本身的限制。快速搜索,结果是ext4文件系统在其inode中为该文件属性添加了存储空间。

ext4 timestamps

答案 1 :(得分:3)

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

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

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

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

  • UFS2 / st_birthtime
  • ZFS / crtime
  • Ext4 / crtime
  • btrfs / otime
  • HFS + /?

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

答案 2 :(得分:1)

正如WhiteboardDev所述,许多现代文件系统 存储文件创建时间,但它不是标准的,因此访问细节的方法各不相同。

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

答案 3 :(得分:1)

stat将返回修改更改st_ctime 一旦文件被修改或者它的所有者改变它的出处变化所以所有的赌注都是关闭内容的 dos / nt在这方面是不可靠的,因为你可以完全删除文件,在命令shell中完整地重写它,创建时间不会改变

与unix中的文件关联的元数据不保证原始创建时间,但保留最新版本的创建时间。如果您需要对文件进行版本控制,则应在外部或内部明确显示版本

通过写入或设置inode信息来更改字段st_ctime        (即所有者,群组,链接计数,模式等)。

        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 */
       };