是否可以使用mtime
在文件上仅设置os.Chtimes
?我以为可以将经过修改的mtime
与未经修改的atime
一起传递给Chtimes
,但是FileInfo
返回的os.Stat
仅给您mtime
,通过os.FileInfo.ModTime()
。
os.Chtimes
需要同时更改atime
和mtime
似乎很奇怪,但是无法从提供的atime
函数中检索os
这与How can I get a file's ctime,atime,mtime and change them using Golang?有关,但我想设置的信息较少。
答案 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。