乐趣区

关于后端:Linux系统文件的三种timeatimectimemtime

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

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

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

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

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

本文由 mdnice 多平台公布

退出移动版