Sie*_*4x4 5 linux windows time properties go
希望提取一个 go 包中文件的文件属性,该包可以在 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()))
Run Code Online (Sandbox Code Playgroud)
同样,我也可以在 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))
Run Code Online (Sandbox Code Playgroud)
然而,当我将这两个语句合并到一个 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))
}
Run Code Online (Sandbox Code Playgroud)
我还意识到 fileinfo.ModTime() 将为我提供两个操作系统的修改日期\时间,但这在 Linux 中没有正确反映,所以如果说文件被移动,则更新 cTime,而不是修改时间,并且我需要检查最后一个文件何时被修改、更改、访问等。
任何帮助将不胜感激,谢谢。