如下图,脚本B从数据文件中采集数据:
当数据文件没有更新时,脚本B采集的都是无效数据。所以需要抓取数据文件的更新时间,如果超过5分钟没更新,就通知脚本A的负责人去及时处理,避免生产数据的更多丢失。
仿照网上,写了如下代码进行实现:
f, err := os.Open(filePath)
if err != nil {
log.Println("open file error")
return
}
defer f.Close()
finfo, err := f.Stat()
if err != nil {
log.Println("stat fileinfo error")
return
}
winFileAttr := finfo.Sys().(*syscall.Win32FileAttributeData)
fmt.Println("last write time:", winFileAttr.LastWriteTime)
lastWriteTime := time.Unix(winFileAttr.LastWriteTime.Nanoseconds()/1e9, 0)
fmt.Println("last write time2:", lastWriteTime)
timeAfterFormat := lastWriteTime.Format("2006-01-02 15:04:05") //1991-01-01 01:01:01
fmt.Println("update time:", timeAfterFormat)
运行后,打印内容如下:
last write time: {2330105708 31026239} last write time2: 2023-04-11 14:33:35 +0800 CST update time: 2023-04-11 14:33:35
本文为翟码农个人博客蓝翟红尘go开发分类下的有关获取Windows系统里文件修改时间的原创文章,转载请注明出处:用go如何获取Windows系统里文件的修改时间 - 翟码农技术博客 (zhai14.com)
http://www.zhai14.com/blog/how-to-get-the-modified-time-of-windows-file-with-go.html
go语言中格式化时间有点奇葩,居然非得以“2006-01-02 15:04:05”这个固定的时间为模板,其它时间就不行,这时间谁记得住。
如果文件一定存在的话,直接2行代码就可以了:
statInfo, _ := os.Stat(config.Index.Path)
fmt.Println("time", statInfo.ModTime())
timeAfterFormat := statInfo.ModTime().Format("2006-01-02 15:04:05")
fmt.Println("update time first:", timeAfterFormat)
如果想获取文件的其它属性,参考下面使用其它方法即可:
// A FileInfo describes a file and is returned by Stat and Lstat. type FileInfo interface { Name() string // 文件名称 Size() int64 // 文件的字节长度 Mode() FileMode // file mode bits ModTime() time.Time // 修改时间 IsDir() bool // 是否是一个目录 Sys() interface{} // underlying data source (can return nil) }
如果像获取文件创建时间什么的,就从下面这行代码入手:
winFileAttr := statInfo.Sys().(*syscall.Win32FileAttributeData)