Есть ли способ установить `mtime` при сохранении` atime` с помощью модуля `os`? - PullRequest
1 голос
/ 29 марта 2019

Есть ли способ установить только mtime для файла с os.Chtimes?Я думал, что смогу передать измененный mtime вместе с неизмененным atime в Chtimes, но FileInfo, возвращаемый os.Stat, дает вам только mtime через os.FileInfo.ModTime().

Кажется странным, что os.Chtimes требует одновременного изменения atime и mtime, но нет способа извлечь atime из предоставленных функций os.

это связано с Как я могу получить файлы ctime, atime, mtime и изменить их с помощью Golang? , но я бы хотел установить меньше информации.

1 Ответ

1 голос
/ 29 марта 2019

Это позволяет вам изменять 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
}

и получать atime, ctime от fi.Sys (). (* Syscall.Stat_t)

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
}

и получает ctime и atime из syscall.Stat_t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...