file - 访问 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 不是“创建时间”,而是“inode 更改时间”。
OSX 有“出生时间”,这是 Finder 显示为“创建日期”的内容,在 Go on OSX ( GOOS=darwin
) 中,它可用作syscall.Stat_tBirthtimespec
的字段。
但是,POSIX 没有定义出生时间,许多其他 Unix 系统要么没有这个概念,要么没有将它暴露给用户程序。直到最近,Linux 还是其中之一。它的stat
系统调用不返回出生时间,所以 Go 也不返回os.Stat
。statx
在 Linux 4.11 中添加的系统调用确实返回了它,但这不在 Go 标准库中。
statx由golang.org/x/sys/unix支持,但它是一个相当低级的接口(例如,它需要一个打开目录的整数文件描述符编号;它不能直接在os.File
. 如果它在太旧的 Linux 版本上运行,它也可能返回一个ENOSYS
错误,即使它足够新,Btime
如果你调用它的文件位于没有出生时间支持的文件系统上,你得到的返回值可能为零,或者如果该文件系统的 Linux 文件系统驱动程序根本没有更新。
推荐阅读
- java - 无法为简单的控制器运行 Spring Boot 测试
- python - 是否可以从条目小部件或文本小部件在树视图中插入多行文本?或类似的东西?
- c# - 自定义调整窗口大小
- python - Python Tkinter 应用程序将焦点从打开的文件夹中移开
- javascript - 如何条带化 HTML标记并将其替换为
? - macos - macOS (AppKit/SwiftUI) 中的自定义对象全选/取消选择菜单项
- c# - 如何在 .NET Core 中使用依赖注入注册多个项目?
- django - django 数据库的初始动态数据
- python - tkinter 将第二帧放在顶层
- rust - try_lock 在异步之外的 futures::lock::Mutex 上?