Как я могу получить файл ctime, atime, mtime и изменить их с помощью Golang?

Как я могу получить файл ctime, mtime, atime использовать golang и изменить их?

В Go 1.1.2, * os.Stat может получить только mtime * os.Chtimes может изменять mtime и atime, но не ctime.

Ответ 1

Linux

ctime

ctime - это время обработки inode или файла. Ctime обновляется, когда атрибуты файла изменены, например, изменение владельца, изменение разрешения или перемещения файла в другую файловую систему, но также будет обновляется при изменении файла.

Файл ctime и atime зависят от ОС. Для Linux ctime устанавливается Linux на текущую временную метку при изменении inode или файла.

Вот пример, в Linux, о неявном изменении ctime, установив atime и mtime на их исходные значения.

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)
}

Вывод:

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

Ответ 2

Я знаю, что это супер-старый, но я собрал различные зависящие от платформы структуры времени доступа к файлам и поместил их в один пакет с унифицированным 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)
}

Ответ 3

В системе Unix вы можете получить файл mtime и ctime через syscall.Stat:

package main

import (
        "fmt"
        "log"
        "syscall"
)

func main() {
        var st syscall.Stat_t
        if err := syscall.Stat("/tmp/sysstat.go", &st); err != nil {
                log.Fatal(err)
        }
        fmt.Printf("mtime: %d\n", st.Mtimespec.Sec)
        fmt.Printf("ctime: %d\n", st.Ctimespec.Sec)
}

Чтобы обновить эти значения, вы сможете использовать syscall.Utimes.