如何使用Golang快速统计文件大小_Golangos Stat文件体积获取方法

最直接方式是调用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 是轻量级系统调用

示例代码:

```go
info, err := os.Stat("example.txt")
if err != nil {
  log.Fatal(err)
}
size := info.Size() // int64 类型
fmt.Printf("文件大小:%d 字节\n", size)
```

常用单位转换:更直观地显示大小

直接输出字节不友好,可按 1024 进制转成 KB/MB/GB:

  • 除以 1024 得 KB,再除得 MB,以此类推
  • 建议保留 1 位小数,用 fmt.Sprintf("%.1f KB", float64(size)/1024)
  • 注意区分二进制(KiB/MiB)和十进制(KB/MB),Go 标准库默认按二进制换算更合理

批量统计多个文件或目录总大小

os.Stat 只适用于已知路径的单个文件;若要算整个目录,需配合 filepath.Walkos.ReadDir 遍历:

  • 对每个 DirEntry 调用 entry.Info() 获取 FileInfo
  • 跳过子目录(可选),只累加普通文件的 Size()
  • 遇到权限错误可用 filepath.WalkDir 的回调控制是否继续

小技巧:用 atomic.Int64 并发安全地累加,配合 sync.WaitGroup 提升大目录遍历效率(非必须,但适合多核场景)。

注意点与避坑提示

几个容易忽略但关键的细节:

  • os.Stat 对符号链接返回的是目标文件信息,如需链接本身大小,改用 os.Lstat
  • 某些特殊文件(如设备文件、管道)可能返回 0 或异常大小,业务中应结合 IsRegular() 判断
  • Windows 下 NTFS 稀疏文件或压缩文件,Size() 返回逻辑大小,不是磁盘占用,如需实际占用请查 syscall.GetFileInformationByHandle(需额外处理)

基本上就这些。不复杂但容易忽略权限和符号链接行为,日常统计够用又稳定。