应用 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 多平台公布