如何获取文件的ctime,mtime,atime使用golang并更改它们?
在Go 1.1.2中, * os.Stat只能获得mtime * os.Chtimes可以改变mtime和atime但不能改变ctime。
答案 0 :(得分:22)
Linux的
ctime是inode或文件更改时间。 ctime会在更新时更新 文件属性已更改,如更改所有者,更改 权限或将文件移动到其他文件系统,但也将 修改文件时更新。
文件ctime和atime是依赖于操作系统的。对于Linux,当inode或文件发生更改时,ctime由Linux设置为当前时间戳。
这是一个在Linux上通过将atime和mtime设置为原始值来隐式更改ctime的示例。
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
答案 1 :(得分:8)
我知道这是超级旧版,但我将各种与平台相关的文件访问时间结构汇总在一起,并将它们放入一个带有统一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)
}
答案 2 :(得分:0)
在Unix系统上,您可以通过syscall.Stat
获取文件的mtime和ctime:
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
。