使用Go操作文件,根据创建时间(或修改时间)进行不同处理。
在Mac上,文件相关的结构体字段在syscall/ztypes_darwin_arm64.go下的Stat_t
:
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。根据以下代码:
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) //创建多级目录 //os.MkdirAll("/Users/fliter/blog", os.ModePerm) } 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命令查看