有没有一种方法可以在设置`mtime`的同时使用`os`模块保留`atime`呢?

时间:2019-03-29 00:33:56

标签: go

是否可以使用mtime在文件上仅设置os.Chtimes?我以为可以将经过修改的mtime与未经修改的atime一起传递给Chtimes,但是FileInfo返回的os.Stat仅给您mtime ,通过os.FileInfo.ModTime()

os.Chtimes需要同时更改atimemtime似乎很奇怪,但是无法从提供的atime函数中检索os

这与How can I get a file's ctime,atime,mtime and change them using Golang?有关,但我想设置的信息较少。

1 个答案:

答案 0 :(得分:1)

这使您可以修改mtime

package main

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

func main() {
    name := "main"
    atime, mtime, ctime, err := statTimes(name)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(atime, mtime, ctime)

    // new mtime
    newMtime := time.Date(2000, time.February, 1, 3, 4, 5, 0, time.UTC)

    // set new mtime
    err = os.Chtimes(name, atime, newMtime)
    if err != nil {
        fmt.Println(err)
        return
    }

    atime, mtime, ctime, err = statTimes(name)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(atime, mtime, ctime)
}

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
}

并从fi.Sys()。(* syscall.Stat_t)获取时间ctime

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

我知道各种操作系统的文件系统是不同的。 常用部分在os.Fileinfo中定义如下。 https://golang.org/search?q=os.FileInfo

// A FileInfo describes a file and is returned by Stat and Lstat.
type FileInfo interface {
    Name() string       // base name of the file
    Size() int64        // length in bytes for regular files; system-dependent for others
    Mode() FileMode     // file mode bits
    ModTime() time.Time // modification time
    IsDir() bool        // abbreviation for Mode().IsDir()
    Sys() interface{}   // underlying data source (can return nil)
}

fileStat是FileInfo的实现。每个操作系统的fileStat声明不同。 https://golang.org/search?q=fileStat

Linux,unix实际上使用以下结构。

// A fileStat is the implementation of FileInfo returned by Stat and Lstat.
type fileStat struct {
    name    string
    size    int64
    mode    FileMode
    modTime time.Time
    sys     syscall.Stat_t
}

并从syscall.Stat_t获取ctime和atime。