在 C/C++ 中以编程方式更改文件在 Linux 中的创建时间戳

Changing the file's creation timestamp in Linux programmatically in C/C++

statx() 系统调用已添加到 Linux 内核,现在可以从支持的文件系统上的 statx.stx_btime 结构字段获取文件的创建(诞生)时间。但是我在 utimensat() 类似的系统调用中找不到任何支持。

是否可以在 C/C++ 中更改文件的创建时间戳以及如何更改?

statx.stx_btime 是特定于文件系统的。 Linux 只有三个标准化时间戳 - ctime、atime 和 mtime - 由与文件系统无关的 generic_fillattr 函数填充。

另一方面,创建时间由特定于文件系统的函数填充,例如对于 ext4,您可以查看相关代码 here:

int ext4_getattr(struct user_namespace *mnt_userns, const struct path *path,
         struct kstat *stat, u32 request_mask, unsigned int query_flags)
{
    struct inode *inode = d_inode(path->dentry);
    struct ext4_inode *raw_inode;
    struct ext4_inode_info *ei = EXT4_I(inode);
    unsigned int flags;

    if ((request_mask & STATX_BTIME) &&
        EXT4_FITS_IN_INODE(raw_inode, ei, i_crtime)) {
        stat->result_mask |= STATX_BTIME;
        stat->btime.tv_sec = ei->i_crtime.tv_sec;
        stat->btime.tv_nsec = ei->i_crtime.tv_nsec;
    }
...

似乎没有简单的方法来访问创建时间 - 快速搜索显示 ext4 的 i_crtime 不可直接修改。

一个可能的解决方案是编写一个特定于文件系统的驱动程序来修改例如i_crtime 直接 - 但这在修改内部文件系统数据方面有其自身的风险。