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