首页 > 解决方案 > 如何在不同的操作系统上处理 fileinfo.sys()

问题描述

希望在一个可以在 linux 和 windows 中使用的包中提取文件的文件属性。

使用 go,在 windows 中我可以成功获取文件的属性:

path = Filename, i.e. c:\123.txt

fileinfo, _ := os.Stat(path)
stat := fileinfo.Sys().(*syscall.Win32FileAttributeData)
aTimeSince = time.Since(time.Unix(0, stat.LastAccessTime.Nanoseconds()))
cTimeSince = time.Since(time.Unix(0, stat.CreationTime.Nanoseconds()))
mTimeSince = time.Since(time.Unix(0, stat.LastWriteTime.Nanoseconds()))

同样,我也可以在 Linux 中获得相同的信息:

fileinfo, _ := os.Stat(path)
aTime = fileinfo.Sys().(*syscall.Stat_t).Atim
cTime = fileinfo.Sys().(*syscall.Stat_t).Ctim
mTime = fileinfo.Sys().(*syscall.Stat_t).Mtim
aTimeSince = time.Since(time.Unix(aTime.Sec, aTime.Nsec))
cTimeSince = time.Since(time.Unix(cTime.Sec, cTime.Nsec))
mTimeSince = time.Since(time.Unix(mTime.Sec, mTime.Nsec))

但是,当我将这两个语句合并到一个 go 文件中时,Linux 拒绝 windows 代码,而 windows 拒绝 Linux 代码。

阅读 go 手册,状态我需要为操作系统指定 $GOOS,但不确定如何执行此操作并且无法在任何地方找到它。

带有 if runtime.GOOS 语句的完整代码示例:

if runtime.GOOS == "windows" {
    fileinfo, _ := os.Stat(path)
    stat := fileinfo.Sys().(*syscall.Win32FileAttributeData)
    aTimeSince = time.Since(time.Unix(0, stat.LastAccessTime.Nanoseconds()))
    cTimeSince = time.Since(time.Unix(0, stat.CreationTime.Nanoseconds()))
    mTimeSince = time.Since(time.Unix(0, stat.LastWriteTime.Nanoseconds()))
} else {
    fileinfo, _ := os.Stat(path)
    aTime = fileinfo.Sys().(*syscall.Stat_t).Atim
    cTime = fileinfo.Sys().(*syscall.Stat_t).Ctim
    mTime = fileinfo.Sys().(*syscall.Stat_t).Mtim
    aTimeSince = time.Since(time.Unix(aTime.Sec, aTime.Nsec))
    cTimeSince = time.Since(time.Unix(cTime.Sec, cTime.Nsec))
    mTimeSince = time.Since(time.Unix(mTime.Sec, mTime.Nsec))
}

我也意识到 fileinfo.ModTime() 会给我两个操作系统的修改日期\时间,但这在 Linux 中没有正确反映,所以如果说一个文件被移动,cTime 被更新,而不是修改时间和我需要检查最后一个文件何时被修改、更改、访问等。

任何帮助将不胜感激,谢谢。

标签: linuxwindowsgotimeproperties

解决方案


推荐阅读