如何更改文件时间戳,包括纳秒

how to change file timestamp including nanoseconds

提问人:programme3219873 提问时间:7/8/2022 最后编辑:Jonathan Lefflerprogramme3219873 更新时间:7/9/2022 访问量:393

问:

我正在制作一个程序将文件从源复制到目标目录,并希望更改目标文件时间戳,以便它们与源文件时间戳匹配。

到目前为止,我已经发现了 utime() 函数,并根据我想使用的时间操纵了结构。utimbuf

但是,时间不考虑纳秒。

例如:

如果我想复制“file1”并且它的时间戳为 123.213241,则在运行当前程序时,我的副本将有 123.000000。我想包括纳秒 .213241 等。

这是我到目前为止的代码:

    struct stat buf; 
    struct utimbuf time;

    stat(filename, &buf) // get metadata of file "filename" and then store in buf

    time.actime = buf.st_atim.tv_sec; // set times in time struct
    time.modtime = buf.st_mtim.tv_sec;

    utime(filename_copy, &time); // load file copy with time struct

如何在文件时间戳中包含纳秒?

C 文件 时间 统计 time.h

评论

0赞 Ted Lyngmo 7/8/2022
“包括纳秒”你确定你的文件系统支持吗?如果是这样,请创建一个文件,然后复制其属性。
0赞 programme3219873 7/8/2022
我相信是的,当在两个文件(副本和原始文件)上运行 linux stat() 命令时,原始文件有纳秒,但副本没有,而只是 .0000(非常适合 stat() 命令中的访问和修改时间)。此外,我正在尝试复制这些属性,但由于某种原因,我不认为并包括纳秒。st_atim.tv_secst_mtim.tv_sec
0赞 Cheatah 7/8/2022
这不是文件系统操作的标准功能,因此您不应期望能够将这些时间戳操作到该详细级别。

答:

4赞 Jonathan Leffler 7/8/2022 #1

根据 POSIX,您需要的函数是 utimensat()(或其近亲 )。这两者都采用数组中的一对值,这允许您指定时间到纳秒。第一个要素是访问时间;二是修改时间。futimens()struct timespec

并非所有文件系统都支持纳秒时间戳。并非所有系统实际上都支持纳秒分辨率——它们可能会四舍五入到最接近的微秒。

请注意,现代版本的 stat() 函数返回一个包含元素 、 和 的结构。这些也是值。<sys/stat.h> 定义了一些向后兼容的宏:st_atimst_ctimst_mtimstruct timespec

为了与本标准的早期版本兼容,宏应使用值 .同样,和 应分别定义为值为 和 的宏。st_atimest_atim.tv_secst_ctimest_mtimest_ctim.tv_secst_mtim.tv_sec

对于 Linux,参见 utimensat(2)。然而,stat(2) 的文档只在底部附近的 Notes 部分提到了亚秒次数。要小心。