如何在 Go 中获取文件的最后访问日期和时间?

Posted

技术标签:

【中文标题】如何在 Go 中获取文件的最后访问日期和时间?【英文标题】:How to get last-accessed date and time of file in Go? 【发布时间】:2012-01-07 19:28:11 【问题描述】:

有人知道如何检查文件访问日期和时间吗?该函数返回修改后的日期和时间,我需要将访问的日期时间与当前日期和时间进行比较。

【问题讨论】:

【参考方案1】:

您可以使用os.Stat 获取一个FileInfo 结构,该结构还包含最后一次访问时间(以及最后一次修改和最后一次状态更改时间)。

info, err := os.Stat("example.txt")
if err != nil 
     // TODO: handle errors (e.g. file not found)

// info.Atime_ns now contains the last access time
// (in nanoseconds since the unix epoch)

之后,您可以使用 time.Nanoseconds 获取当前时间(也是自 unix 纪元 1970 年 1 月 1 日 00:00:00 UTC 以来的纳秒)。要获得以纳秒为单位的持续时间,只需减去这两个值:

duration := time.Nanoseconds() - info.Atime_ns

【讨论】:

自 Go 1.0 以来这一直不正确。您可以通过查看FileInfo's Sys 字段(其类型取决于GOOS)以非便携式方式获得时间。 time.Nanoseconds() 不会告诉自纪元以来的时间。它只是告诉当前秒的偏移量。正确的方法是 time.Now().Unix(),但这会在几秒钟内给出... time.Now().UnixNano() 怎么样 如果您关心多平台,issue 提供了有关每个平台的系统调用字段的有用摘要。【参考方案2】:

或者,在Stat之后你也可以这样做

statinfo.ModTime()

如果您需要它,例如用于网络服务器,您也可以在其上使用 Format()

见https://gist.github.com/alexisrobert/982674

【讨论】:

这个问题询问的是 access 时间,而不是 mod-time。 我用谷歌搜索了你回答的问题,所以这个答案得到了我的 +1。谢谢!【参考方案3】:

通过将os.FileInfo 转换为*syscall.Stat_t

package main

import ( "fmt"; "log"; "os"; "syscall"; "time" )

func main() 
    for _, arg := range os.Args[1:] 
        fileinfo, err := os.Stat(arg)
        if err != nil 
            log.Fatal(err)
        
        atime := fileinfo.Sys().(*syscall.Stat_t).Atim
        fmt.Println(time.Unix(atime.Sec, atime.Nsec))
    

【讨论】:

这是特定于操作系统的

以上是关于如何在 Go 中获取文件的最后访问日期和时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中获取目录的最后修改日期和时间

如何在Filesystem中获取最后修改日期和时间?

如何从char *获取pdf文件的最后写入日期(文件在内存中)

如何在 GWT 中获取最后一周的日期

在Java中获取文件的最后修改日期

如何根据特定日期获取最后修改的文件并导入python脚本[重复]