如何获取文件的ctime,atime,mtime并使用Golang更改它们?

use*_*777 11 file go

如何获取文件的ctime,mtime,atime使用golang并更改它们?

在Go 1.1.2中,*os.Stat只能获取mtime*os.Chtimes可以改变mtime和atime但不能改变ctime.

pet*_*rSO 22

Linux的

的ctime

ctime是inode或文件更改时间.更改文件属性时,ctime会更新,例如更改所有者,更改权限或将文件移动到其他文件系统,但在修改文件时也会更新.

文件ctime和atime是依赖于操作系统的.对于Linux,当inode或文件发生更改时,ctime由Linux设置为当前时间戳.

以下是Linux上通过将atime和mtime设置为原始值来隐式更改ctime的示例.

package main

import (
    "fmt"
    "os"
    "syscall"
    "time"
)

func statTimes(name string) (atime, mtime, ctime time.Time, err error) {
    fi, err := os.Stat(name)
    if err != nil {
        return
    }
    mtime = fi.ModTime()
    stat := fi.Sys().(*syscall.Stat_t)
    atime = time.Unix(int64(stat.Atim.Sec), int64(stat.Atim.Nsec))
    ctime = time.Unix(int64(stat.Ctim.Sec), int64(stat.Ctim.Nsec))
    return
}

func main() {
    name := "stat.file"
    atime, mtime, ctime, err := statTimes(name)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(atime, mtime)
    fmt.Println(ctime)
    err = os.Chtimes(name, atime, mtime)
    if err != nil {
        fmt.Println(err)
        return
    }
    atime, mtime, ctime, err = statTimes(name)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(atime, mtime)
    fmt.Println(ctime)
}
Run Code Online (Sandbox Code Playgroud)

输出:

2014-01-02 02:21:26.262111165 -0500 EST 2014-01-02 02:18:13.253154086 -0500 EST
2014-01-02 02:21:25.666108207 -0500 EST
2014-01-02 02:21:26.262111165 -0500 EST 2014-01-02 02:18:13.253154086 -0500 EST
2014-01-02 02:21:43.814198198 -0500 EST
Run Code Online (Sandbox Code Playgroud)


Dus*_*tin 9

我知道这是超级旧的,但我将各种与平台相关的文件访问时间结构放在一起,并将它们放在一个带有统一API的包中:

https://github.com/djherbis/atime

package main

import (
  "log"

  "github.com/djherbis/atime"
)

func main() {
  at, err := atime.Stat("myfile")
  if err != nil {
    log.Fatal(err.Error())
  }
  log.Println(at)
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以在其他时间结帐https://github.com/djherbis/times. (2认同)