访问 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 可能为零。
我有一个来自信息 (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.
然而,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 可能为零。