【问题标题】:accessing ctime does not return the creation time of a file访问 ctime 不会返回文件的创建时间
【发布时间】:2021-05-26 15:52:05
【问题描述】:

我有一个来自 info (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 中。

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

【问题讨论】:

标签: file go unix debian system-calls


【解决方案1】:

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

OSX 有“出生时间”,即 Finder 显示为“创建日期”的内容,在 Go on OSX (GOOS=darwin) 中,它可以作为 syscall.Stat_tBirthtimespec 字段使用。

但是,POSIX 没有定义出生时间,许多其他 Unix 系统要么没有这个概念,要么没有将它暴露给用户程序。直到最近,Linux 还是其中之一。它的 stat 系统调用不返回出生时间,所以 Go 的 os.Stat 也不返回。 statx 系统调用,在 Linux 4.11 中添加,确实返回它,但这不在 Go 标准库中。

golang.org/x/sys/unix 支持

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

【讨论】:

  • 非常有趣的答案,非常感谢。事实上,我可能会遇到前一段时间在旧的 unix 系统上创建的文件,因此它们的标题可能没有创建时间字段。感觉它比其他任何东西都更容易出错。
  • 请注意,大多数 BSD 现在也有出生时间,但有相同的注意事项。
猜你喜欢
  • 2023-03-03
  • 2020-06-07
  • 1970-01-01
  • 2011-08-27
  • 2017-06-04
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多