使用Go操作文件,根据创建时间(或修改时间)进行不同处理。
在Mac上,文件相关的结构体字段在syscall/ztypes_darwin_arm64.go下的Stat_t:
type Stat_t struct {Dev int32Mode uint16Nlink uint16Ino uint64Uid uint32Gid uint32Rdev int32Pad_cgo_0 [4]byteAtimespec TimespecMtimespec TimespecCtimespec TimespecBirthtimespec TimespecSize int64Blocks int64Blksize int32Flags uint32Gen uint32Lspare int32Qspare [2]int64
}
时间相关的有四个字段,即Atimespec、Mtimespec、Ctimespec和Birthtimespec。根据以下代码:
package mainimport ("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命令查看