访问 ctime 不会 return 文件的创建时间

accessing ctime does not return the creation time of a file

我有一个来自信息 (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))

但他们都是 return:

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.[=16 中保存二进制文件=]

显然这不是文件的创建时间。知道如何获取此信息吗?

ctime 不是“创建时间”,而是“inode 更改时间”。

OSX 有“出生时间”,这是 Finder 显示为“创建日期”的时间,在 Go on OSX (GOOS=darwin) 中它可用作 [= syscall.Stat_t.

的 11=] 字段

然而,POSIX 并没有定义出生时间,许多其他 Unix 系统要么没有这个概念,要么不将其暴露给用户程序。 Linux 直到最近才成为其中之一;它的 stat 系统调用没有 return 出生时间,所以 Go 的 os.Stat 也没有。在 Linux 4.11 中添加的 statx 系统调用 确实 return 它,但这不在 Go stdlib 中。

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