os.stat 返回的 fileinfo 中直接调用 size() 方法即可获取文件大小(int64 字节数);它不打开文件,仅读取元数据,高效安全;注意检查 err,区分符号链接与目标文件需用 os.lstat()。

os.Stat 返回的 FileInfo 里怎么拿到文件大小
直接取 FileInfo.Size(),它返回的是 int64 字节数。别用 os.File 的 Stat() 方法后又去读文件头——完全没必要,os.Stat() 一次调用就全有了。
-
os.Stat()不打开文件,只查元数据,快且安全 - 如果路径是符号链接,默认返回链接本身的信息;要目标文件信息,用
os.Lstat() - 注意检查错误:路径不存在、没权限时
err != nil,别假设一定成功
info, err := os.Stat("config.json")
if err != nil {
log.Fatal(err) // 比如 "no such file or directory"
}
size := info.Size() // 就是字节数,不是 KB/MB
判断是不是普通文件、目录或符号链接
靠 FileInfo.Mode() 的位掩码判断,不是用字符串比对名字或扩展名。
-
info.Mode().IsDir()→ 目录 -
info.Mode().IsRegular()→ 普通文件(最常用) -
info.Mode()&os.ModeSymlink != 0→ 符号链接(IsSymlink()在 Go 1.19+ 才有,老版本得手写) -
info.Mode()&os.ModeNamedPipe != 0→ 管道,Linux 下常见于/dev/stdin
别用 strings.HasSuffix(name, ".log") 判断日志文件——后缀毫无意义,Mode() 才反映真实类型。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
修改时间、权限这些字段怎么读和用
FileInfo.ModTime() 返回 time.Time,可直接比较或格式化;FileInfo.Mode() 是 os.FileMode 类型,本质是 uint32,权限位藏在里面。
- 修改时间比较:用
t1.After(t2)或t1.Before(t2),别自己算秒数差 - 权限判断:用
info.Mode()&0o755 == 0o755检查是否恰好是 rwxr-xr-x;更常见的是info.Mode()&0o100 != 0看用户是否有执行权 - 注意:
Mode()包含类型位(如os.ModeDir)和权限位,做权限运算前建议先 &0o777 - Windows 下权限位基本无效,
Mode()主要用来判类型
os.Stat 和 filepath.Walk 的性能与适用场景差异
单个文件查属性,无脑用 os.Stat();批量遍历目录树,别循环调 os.Stat(),改用 filepath.Walk() 或 filepath.WalkDir()(Go 1.16+ 推荐)。
-
filepath.WalkDir()更轻量,不走os.Stat()两次,尤其在 Linux ext4/xfs 上能省 syscall - 如果只需要文件大小和路径,
WalkDir()的DirEntry提供Size()和Type(),不用额外Stat() - 注意:
WalkDir()不保证顺序,也不自动跳过.git这类目录,得自己在回调里判断entry.IsDir() && entry.Name() == ".git" - 并发调
os.Stat()太多可能触发系统级限制(比如 open files),批量操作优先走 Walk
硬盘上百万小文件时,WalkDir 和反复 Stat 的耗时能差一个数量级——这点容易被忽略,等压测才发现卡在 IO 调用上。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










