gpt4 book ai didi

go - 有没有办法在使用 `mtime` 模块保留 `atime` 的同时设置 `os`?

转载 作者:IT王子 更新时间:2023-10-29 02:07:07 25 4
gpt4 key购买 nike

有没有什么方法可以在 os.Chtimes 的文件上只设置 mtime ?我以为我可以将修改后的 mtime 和未修改的 atime 一起传递给 Chtimes,但是 FileInfo 返回 os.Stat 仅通过 os.FileInfo.ModTime() 为您提供 mtime

os.Chtimes 需要同时更改 atimemtime 似乎很奇怪,但是没有办法检索 atime 来自提供的 os 函数。

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

最佳答案

这允许您修改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) 获取 atime、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其实用的是下面的struct。

// 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。

关于go - 有没有办法在使用 `mtime` 模块保留 `atime` 的同时设置 `os`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55408866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com