0

0

如何在Golang中获取文件权限与修改时间 Go语言FileMode与FileInfo详解

P粉602998670

P粉602998670

发布时间:2026-03-16 17:58:34

|

265人浏览过

|

来源于php中文网

原创

最稳妥的方式是调用 os.Stat 获取 os.FileInfo 接口,而非直接操作 syscall.Stat_t;需用 Mode().Perm() 提取权限、ModTime() 获取时间,并用 IsDir() 等方法判断类型,避免位运算和纳秒级相等比较。

如何在golang中获取文件权限与修改时间 go语言filemode与fileinfo详解

os.Stat 读取文件元信息,别直接操作 syscall.Stat_t

Go 中获取权限和修改时间,最稳妥的方式是调用 os.Stat,它返回 os.FileInfo 接口。自己去调用底层 syscall.Stat 容易漏掉平台差异(比如 Windows 的 mtime 精度、Unix 的纳秒支持),也绕过了 Go 对符号链接的默认处理逻辑。

常见错误现象:os.Lstatos.Stat 混用导致读到的是链接本身还是目标文件的权限搞反;或者用 unsafe 强转 FileInfo 底层结构体,结果在不同 Go 版本间崩溃。

  • os.Stat 跟随符号链接,os.Lstat 不跟随 —— 权限判断前先想清楚你关心的是链接文件本身,还是它指向的目标
  • FileInfo.Mode() 返回 os.FileMode,不是原始整数,别用 & 直接跟八进制字面量比(如 0755),要用 Perm() 方法提取权限位
  • 修改时间通过 FileInfo.ModTime() 获取,类型是 time.Time,不是秒数或纳秒整数 —— 需要比较或格式化时直接用 time.Time 方法

os.FileMode 不是 chmod 数字,它的底层是 uint32 但语义已封装

os.FileMode 看起来像 0644,但它本质是带标志位的类型:低 12 位存 Unix 权限,高位存目录、设备、套接字等类型标识。直接拿 uint32(fmode) 去做 fmt.Printf("%o", ...) 可能显示 100644(多了 100000 表示普通文件),这不是 bug,是设计如此。

使用场景:判断是否可执行、是否为目录、是否为符号链接,都该用对应方法,而不是位运算硬解。

立即学习go语言免费学习笔记(深入)”;

阿里妈妈·创意中心
阿里妈妈·创意中心

阿里妈妈营销创意中心

下载
  • 判断是否为目录:fi.Mode().IsDir(),不是 fi.Mode()&os.ModeDir != 0(虽然也能 work,但可读性差且忽略类型组合)
  • 提取纯权限位(用于日志或对比):fi.Mode().Perm(),它只返回低 9 位,fi.Mode().Perm() == 0644 才安全
  • 判断是否可执行:fi.Mode().Perm()&0111 != 0,注意是 0111(八进制),不是 0x111;Go 的 os.FileMode 字面量默认八进制

FileInfo.ModTime() 在不同文件系统上精度不一致,别依赖纳秒级相等

ModTime() 返回的 time.Time 在 ext4 上可能精确到纳秒,在 NTFS 或某些网络文件系统(如 NFSv3)上可能只到秒级,甚至有 2 秒偏差。直接用 == 比较两个 ModTime() 结果,在跨平台或挂载远程存储时大概率出错。

性能影响:调用 ModTime() 本身无额外系统调用(信息已在 os.Stat 一次性读入),但频繁做纳秒级比较会掩盖实际精度限制。

  • 需要判断“是否更新过”:用 t1.After(t2)t1.Sub(t2) > 0,比 == 更健壮
  • 需要容忍误差(比如同步工具):用 t1.Sub(t2).Abs() 判定“基本一致”
  • 别把 ModTime().UnixNano() 存数据库当唯一依据 —— 同一文件在不同机器上 Stat 出来可能差几纳秒,纯属正常

Windows 下没有“用户/组权限位”,Perm() 返回值只是模拟

Windows 文件系统(NTFS)原生不使用 Unix-style rwx 位,Go 的 os.FileMode.Perm() 在 Windows 上返回的是基于 ACL 的启发式映射(比如 Owner 允许写就设 0200),不可靠。如果你的程序需跨平台做权限校验,别依赖 Perm() 的具体数值。

容易踩的坑:在 Windows 上测试时发现 fi.Mode().Perm() == 0666 成立,上线 Linux 就失败;或者用 chmod 类逻辑去“还原”权限,结果在 Windows 上静默失效。

  • 真正需要控制访问时,用 os.Chmod(它在 Windows 上会尝试设置 ACL)而不是手动拼 os.FileMode
  • 仅作展示用途(如 ls -l 模拟):Windows 下可接受 Perm() 的近似值,但加注释说明“非真实权限位”
  • 涉及安全决策(如“是否允许上传执行文件”):必须走系统级 ACL 检查,不能只看 Perm()
事情说清了就结束。 FileMode 和 ModTime 看似简单,但跨平台、跨文件系统时,那些“应该一样”的假设最容易翻车。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

211

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

247

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

357

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

214

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

410

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

510

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

201

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

1539

2025.06.17

chatgpt使用指南
chatgpt使用指南

本专题整合了chatgpt使用教程、新手使用说明等等相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 6.3万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号