如何在不同的操作系统上处理fileinfo.sys()

时间:2019-05-09 16:18:03

标签: linux windows go time properties

希望提取可以在linux和Windows中使用的go软件包中文件的文件属性。

使用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将被更新,而不是修改后的日期/时间。时间,我需要检查最后一个文件何时被修改,更改,访问等。

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

0 个答案:

没有答案