【问题标题】:File creation time in unixunix 中的文件创建时间
【发布时间】:2012-04-16 08:46:07
【问题描述】:

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

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

【问题讨论】:

  • 如果inode-data(如所有者、组模式等)没有改变,则可以使用“ctime”字段(如果存在)。

标签: unix


【解决方案1】:

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

ext4 timestamps

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 嗨 jilliagre,非常感谢您的分享!这篇文章已经过去几年了,我想知道您是否可以使用您拥有的任何新信息对其进行更新,例如您是否知道 HFS+ 的方法以及您是否了解其他任何文件系统?谢谢!!
    【解决方案3】:

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

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

    【讨论】:

    • 嗨,斯蒂芬,你能不能链接到用于获取创建日期的不同方法,那真是太棒了!我目前正在寻找他们。编辑:啊,我认为@jlliagre 列出了它们,这是真的吗? stackoverflow.com/a/10172234/1828637
    【解决方案4】:

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

    【讨论】:

    • 嗨 Paddy,你的意思是说st_ctime,“上次状态更改的时间”,是获取出生时间的可靠方法吗?
    • st_ctime 记录 inode stat 结构发生变化(如文件大小或模式位)。 “c”表示状态 change,而不是文件 create.
    猜你喜欢
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多