【问题标题】:Changing the file's creation timestamp in Linux programmatically in C/C++在 C/C++ 中以编程方式在 Linux 中更改文件的创建时间戳
【发布时间】:2021-09-20 08:51:15
【问题描述】:

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

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

【问题讨论】:

  • 为什么要更改文件的创建时间戳?那应该解决什么问题?此外,这样做真的有意义吗?就这样篡改历史?
  • @Someprogrammerdude 我需要使用与备份应用程序中的原始文件相同的时间戳(btime、atime 和 mtime)复制文件。
  • 所以你想克隆文件?如果您使用该术语(克隆)进行搜索,那么您会获得更好的点击率吗?
  • @Someprogrammerdude 在我的情况下,克隆文件没用。备份文件以不同于源文件系统的方式存储在我的备份工具数据库中。当我将文件从数据库恢复到目标文件系统时,我需要创建新文件,然后更改其时间戳。这就是我需要直接更改文件时间戳的原因。
  • 作为一名法医调查员,我想说你真的不应该这样做。从备份的角度来看,忽略出生时间戳应该没有缺点。

标签: c++ c linux filesystems


【解决方案1】:

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 直接 - 但这会在修改内部文件系统数据方面带来风险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多