当前位置: 首页 > article >正文

go 适配windows和linux获取文件创建时间的方法(跨平台的方法不一致的解决问题)

这个问题,按我理解也是非常普通的一个需求,但是今天查资料时,发现获取文件的创建时间,竟然要区分平台来实现代码,无法做到统一。

比如像这篇博文,https://blog.csdn.net/qq_37703224/article/details/140838032。有解释如何分别在windows和linux上获取文件创建时间的方法,但是却提供同时适配两种系统的办法。

我摸索了一个多小时,翻了golang的issue,发现有人提这个问题,但是似乎没找到解决方法,主要的困扰如下:
在这里插入图片描述
windows系统下, 是无法直接引入Stat_t的。

我四处搜寻,也去找有没有开源的项目解决这个问题,大概翻了一下,也没看到有。

但是我还是不死心,然后就去翻一下源码,为什么windows下就不能提供统一的接口呢?

我通过Win32FileAttributeData跳转过去,看看有啥特别的,接过无意间发现不是也有一个linux的types吗?
在这里插入图片描述
然后我点进去,搜一下关键词file

在这里插入图片描述
咦?这不是有吗?而且是大写字母开头的,为啥引用时却不行呢?

然后我就浏览一下整个文件。发现开头有行注释很特殊//go:build ignore。感觉这个是有关系的。

于是搜索了一下。原来go的编译器在编译时,会处理这一类的关键词,而且文件名也是有特殊作用的。xxx_linux.go,以_linux.go结尾的文件,会认定为linux环境下才会编译的文件。windows环境下是无法引入和编译的。

所以找到了无法引用Stat_t的原因了。于是,我就试一下,也起一个这样的名字的文件:
在这里插入图片描述
果然,在windows的开发环境下, 只要按照规则起名,也是可以引用linux下的代码:

// 不同操作系统下,会编译不同的文件
func GetFileCreateTime(sys any) *time.Time {
	linuxFileAttr := sys.(*syscall.Stat_t)
	createdTime := time.Unix(linuxFileAttr.Ctim.Sec, linuxFileAttr.Ctim.Nsec)
	return &createdTime
}

总算,花了一个多小时,总算把这个问题解决了,只要对这一类问题,区分不同的文件,按照规则起名,就可以解决这一类问题。

又学会了一个知识点,golang是以这种方式解决跨平台的问题的。


http://www.kler.cn/a/446895.html

相关文章:

  • gitee给DeployKey添加push权限
  • 通过阿里云 Milvus 与 PAI 搭建高效的检索增强对话系统
  • docker springboot 运维部署详细实例
  • 华为云计算HCIE笔记01
  • linux-----进程及基本操作
  • uniApp上传文件踩坑日记
  • RabbitMQ如何构建集群?
  • 华为云检查服务器状态
  • 遇见物联网
  • day4:tomcat—maven-jdk
  • MySQL结构的主要组成
  • 分布式数据存储基础与HDFS操作实践
  • 【EXCEL 逻辑函数】AND、OR、XOR、NOT、IF、IFS、IFERROR、IFNA、SWITCH
  • SQL 插入数据详解
  • 基于SSM+Vue的个性化旅游推荐系统
  • 如何在 Debian 12 上安装和使用 Vuls 漏洞扫描器
  • CUDA基础编程:开启深度学习 GPU 加速之门
  • OpenCV与Qt5开发卡尺找圆工具
  • STM32 水质水位检测项目 (调试模块)和(延时模块)
  • Cyber Weekly #36
  • 《Java核心技术I》Swing中的边框
  • OOP面向对象编程:类与类之间的关系
  • 进程与线程以及如何查看
  • 12.15-12.22学习周报
  • uniapp video组件无法播放视频解决方案
  • C# Winform自定义的UI分页控件