访问 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-stretchdebian:bullseye-slim


显然,这不是文件的创建时间。任何想法,我怎么能得到这个信息?


九州编程
浏览 97回答 1
1回答

Helenr

ctime不是“创建时间”,而是“inode change time”。OSX具有“出生时间”,这是Finder显示为“创建日期”,而在OsX上的Go中()中,它可以用作系统调用字段。Stat_t。GOOS=darwinBirthtimespec但是,POSIX没有定义出生时间,许多其他Unix系统要么没有这个概念,要么没有向用户程序公开它。直到最近,Linux还是其中之一。它的系统调用不会返回出生时间,所以Go's也不会。在 Linux 4.11 中添加的系统调用确实会返回它,但这不在 Go stdlib 中。statos.Statstatxstatx受 golang.org/x/sys/unix 但它是一个相当低级的接口(例如,它需要一个开放目录的整数文件描述符号;它不能直接在)。如果它运行在太旧的Linux版本上,即使它足够新,如果你调用它的文件在没有出生时间支持的文件系统上,或者如果该文件系统的Linux文件系统驱动程序根本没有更新,你得到的可能也是零。os.FileENOSYSBtime
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go