访问ctime不返回文件的创建时间 [英] accessing ctime does not return the creation time of a file

查看:18
本文介绍了访问ctime不返回文件的创建时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个来自信息的文件(Mac Os):

Created: Tuesday, 26 May 2020 at 11:21
Modified: 26 May 2021 at 15:40

在做了一些研究之后,我试着去做:

ctim := fi.Sys().(*syscall.Stat_t).Ctim

atim := fi.Sys().(*syscall.Stat_t).Atim
mtim := fi.Sys().(*syscall.Stat_t).Mtim
log.Println("ctim:", time.Unix(ctim.Sec, ctim.Nsec))
log.Println("atim:", time.Unix(atim.Sec, atim.Nsec))
log.Println("mtim:", time.Unix(mtim.Sec, mtim.Nsec))

但它们都会返回:

app_1  | 2021/05/26 15:40:17 ctim: 2021-05-26 15:40:17.199113879 +0000 UTC
app_1  | 2021/05/26 15:40:17 atim: 2021-05-26 15:40:16.457499729 +0000 UTC
app_1  | 2021/05/26 15:40:17 mtim: 2021-05-26 15:40:05.982391804 +0000 UTC

我还使用了docker+docker-compose,从golang:1.14-stretch生成并在debian:bullseye-slim中保存二进制文件。

显然,这不是文件的创建时间。你知道我怎样才能得到这个信息吗?

推荐答案

ctime不是";创建时间,而是信息节点更改时间。

OSX有&Quot;出生时间&Quot;,这是查找器显示为&Quot;创建日期&Quot;的内容,而在Go On OSX(GOOS=darwin)中,它作为syscall.Stat_tBirthtimespec字段提供。

然而,出生时间不是由POSIX定义的,许多其他Unix系统要么没有这个概念,要么没有向用户程序公开它。直到最近,Linux都是其中之一;它的statsyscall不返回出生时间,因此Go的os.Stat也不返回出生时间。Linux 4.11中添加的statxsyscall不会返回它,但它不在Go stdlib中。

statxgolang.org/x/sys/unix支持的,但它是一个相当低级的接口(例如,它需要打开目录的整数文件描述符编号;它不能直接在os.File上工作)。如果它在太旧的Linux版本上运行,它也可能返回ENOSYS错误,并且即使它足够新,如果您调用它的文件位于没有出生时间支持的文件系统上,或者如果该文件系统的Linux文件系统驱动程序根本没有更新,则返回的Btime可能为零。

这篇关于访问ctime不返回文件的创建时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆