应用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 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

<img src="Linux系统文件的三种time-atime-ctime-mtime/0.png" width = 100% height = 50% />

mtime是指文件内容被最初一次批改的工夫,ctime则指文件的元数据(如权限,所有者等)最初一次被批改的工夫


在Linux中,能够通过stat命令查看


更多测试&验证相干,可参考此文

本文由mdnice多平台公布