希望提取可以在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将被更新,而不是修改后的日期/时间。时间,我需要检查最后一个文件何时被修改,更改,访问等。
任何帮助将不胜感激,谢谢。