登录
首页 >  Golang >  Go问答

可以使用“os”模块设置文件的“mtime”而保留“atime”吗?

来源:stackoverflow

时间:2024-03-10 08:33:26 330浏览 收藏

本篇文章向大家介绍《可以使用“os”模块设置文件的“mtime”而保留“atime”吗?》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

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

os.Chtimes 需要同时更改 atimemtime 似乎很奇怪,但无法从提供的 os 函数中检索 atime

这与如何使用 Golang 获取文件的 ctime、atime、mtime 并更改它们有关? ,但我想设置更少的信息。


解决方案


这允许您修改 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实际上使用以下结构体。

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

今天关于《可以使用“os”模块设置文件的“mtime”而保留“atime”吗?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>