在Go中获取文件夹的更改日期

时间:2018-11-12 17:07:57

标签: go

我想从终端获取重命名文件夹的日期,可以使用stat命令来完成,例如:

> stat -x folders/folder1
File: "folders/folder1"
Size: 64           FileType: Directory
Mode: (0755/drwxr-xr-x)         Uid: (2006390509/username)  Gid: 
(296108113/EMEA\Domain Users)
Device: 1,4   Inode: 2599274    Links: 2
Access: Mon Nov 12 17:59:57 2018
Modify: Mon Nov 12 14:12:20 2018
Change: Mon Nov 12 17:28:01 2018 

更改日期是文件夹元数据更改的最后日期,其中包括重命名。

有什么方法可以通过Go而不使用os.exec并解析输出吗? os.Stat似乎只提供了上次修改日期,重命名文件夹后该日期不变。

2 个答案:

答案 0 :(得分:3)

更改时间无法在os.FileInfo中访问,但可以通过存储数据的os.FileInfo.Sys()获取。

您可以通过

获得它
package main

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

func main() {
    f, err := os.Stat("your/dir")
    if err != nil {
        log.Fatalf("err reading: %v", err)
    }

    //access change time saved in os.FileInfo.Sys()
    changeTime := f.Sys().(*syscall.Stat_t).Ctim

    fmt.Print(time.Unix(changeTime.Unix()).String())
}

当然,您需要检查f.Sys()是否正确,但是syscall.Stat_t.Ctim可能正是您想要的。

答案 1 :(得分:1)

如果您对调用os.Exec感到满意,也许您不介意跨平台问题。 github issue前一段时间对此进行了一些讨论。

此代码对我来说无论如何都可以更改时间。不确定如何/是否可以在Windows上运行:

file, err := os.Open("test")
if err != nil {
    panic(err)
}

stat, err := file.Stat()
sys := stat.Sys().(*syscall.Stat_t)
changedTime := time.Unix(sys.Ctim.Unix())

fmt.Println(stat.ModTime())
fmt.Println(changedTime)

我跑步时

mv test test1 && mv test1 test && go run main.go

它给了我

2018-11-12 17:31:38.659095951 +0000 GMT
2018-11-12 17:57:43.042208583 +0000 GMT

哪个似乎正确反映了我更改目录名的时间,而不是创建时间(如第一个日期)