使用Go操作文件,根据创建时间(或修改时间)进行不同处理。
在Mac上,文件相关的结构体字段在syscall/ztypes_darwin_arm64.go下的Stat_t:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| type Stat_t struct { Dev int32 Mode uint16 Nlink uint16 Ino uint64 Uid uint32 Gid uint32 Rdev int32 Pad_cgo_0 [4]byte Atimespec Timespec Mtimespec Timespec Ctimespec Timespec Birthtimespec Timespec Size int64 Blocks int64 Blksize int32 Flags uint32 Gen uint32 Lspare int32 Qspare [2]int64 }
|
时间相关的有四个字段,即Atimespec、Mtimespec、Ctimespec和Birthtimespec。根据以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| package main
import ( "fmt" "github.com/pkg/errors" "os" "syscall" "time" )
func main() { file, err := os.Stat("/Users/fliter/blog") if err != nil && errors.Is(err, os.ErrNotExist) { fmt.Println("文件确实不存在,err is:", err) }
stat_t := file.Sys().(*syscall.Stat_t)
fmt.Println(stat_t) fmt.Println(timespecToTime(stat_t.Atimespec)) fmt.Println(timespecToTime(stat_t.Ctimespec)) fmt.Println(timespecToTime(stat_t.Mtimespec)) fmt.Println(timespecToTime(stat_t.Birthtimespec))
}
func timespecToTime(ts syscall.Timespec) time.Time { return time.Unix(ts.Sec, ts.Nsec) }
|
创建时间并不是Ctimespec,而是Birthtimespec。
Ctimespec和Mtimespec似乎都是修改时间??
这就涉及到UNIX/Linux操作系统中,文件相关的三个time---atime,mtime,ctime
mtime是指文件内容被最后一次修改的时间,ctime则指文件的元数据(如权限,所有者等)最后一次被修改的时间
在Linux中,可以通过stat命令查看
更多测试&验证相关,可参考此文
原文链接: https://dashen.tech/2016/09/04/Linux系统文件的三种time-atime-ctime-mtime/
版权声明: 转载请注明出处.