最直接方式是调用os.Stat获取os.FileInfo接口并调用Size()方法得到int64字节数;需检查err、不需打开文件、支持大文件;可转KB/MB/GB(1024进制),批量统计需配合filepath.Walk或os.ReadDir。

用 Go 语言获取单个文件大小最直接的方式是调用 os.Stat,它返回一个 os.FileInfo 接口,其中 Size() 方法就能拿到字节数。
基础用法:获取单个文件体积
只需传入文件路径,调用 os.Stat,检查错误,然后读取 Size():
- 返回值是
int64,单位为字节,适合大文件 - 注意要判断
err != nil,比如路径不存在、无权限时会报错 - 不需要打开文件,
Stat是轻量级系统调用
示例代码:
```goinfo, err := os.Stat("example.txt")
if err != nil {
log.Fatal(err)
}
size := info.Size() // int64 类型
fmt.Printf("文件大小:%d 字节\n", size)
```
常用单位转换:更直观地显示大小
直接输出字节不友好,可按 1024 进制转成 KB/MB/GB:
立即学习“go语言免费学习笔记(深入)”;
- 除以 1024 得 KB,再除得 MB,以此类推
- 建议保留 1 位小数,用
fmt.Sprintf("%.1f KB", float64(size)/1024) - 注意区分二进制(KiB/MiB)和十进制(KB/MB),Go 标准库默认按二进制换算更合理
批量统计多个文件或目录总大小
os.Stat 只适用于已知路径的单个文件;若要算整个目录,需配合 filepath.Walk 或 os.ReadDir 遍历:
- 对每个
DirEntry调用entry.Info()获取FileInfo - 跳过子目录(可选),只累加普通文件的
Size() - 遇到权限错误可用
filepath.WalkDir的回调控制是否继续
小技巧:用 atomic.Int64 并发安全地累加,配合 sync.WaitGroup 提升大目录遍历效率(非必须,但适合多核场景)。
注意点与避坑提示
几个容易忽略但关键的细节:
-
os.Stat对符号链接返回的是目标文件信息,如需链接本身大小,改用os.Lstat - 某些特殊文件(如设备文件、管道)可能返回 0 或异常大小,业务中应结合
IsRegular()判断 - Windows 下 NTFS 稀疏文件或压缩文件,
Size()返回逻辑大小,不是磁盘占用,如需实际占用请查syscall.GetFileInformationByHandle(需额外处理)
基本上就这些。不复杂但容易忽略权限和符号链接行为,日常统计够用又稳定。










