Golang如何获取文件大小和信息_Golang文件属性获取教程【精通】

张开发
2026/4/8 4:00:43 15 分钟阅读

分享文章

Golang如何获取文件大小和信息_Golang文件属性获取教程【精通】
os.Stat 最轻量获取文件元信息但不保证文件存在需用 os.IsNotExist(err) 判断FileInfo.Size() 是逻辑长度非磁盘占用os.ReadDir 比 filepath.Walk 快但不递归ModTime() 精度依赖文件系统。os.Stat 返回 *os.FileInfo 但不打开文件调用 os.Stat 是获取文件大小、权限、修改时间等元信息最轻量的方式它只读取目录项或 inode不打开文件句柄也不会触发 I/O除非文件系统特殊。适合批量检查、判断存在性或预估处理成本。常见错误是误以为 os.Stat 会失败就代表文件不存在——其实它也可能因权限不足如对父目录无执行权限、路径是损坏符号链接、或 NFS 挂载异常而返回 os.ErrPermission 或 os.PathError{Op: stat}不能直接等价于“文件不存在”。用 os.IsNotExist(err) 判断是否真不存在而不是直接检查 err ! nil如果后续还要读文件别重复调用 os.Stat os.Open考虑用 os.Open 后调 file.Stat() 复用句柄注意Windows 下硬链接、重解析点可能让 os.Stat 和 os.Lstat 行为不同需跟随符号链接时用 os.Stat否则用 os.LstatFileInfo.Size() 返回 int64不是字节数的“估算”FileInfo.Size() 是精确值对应文件的逻辑长度st_size对普通文件就是字节数对设备文件、管道、socket 等可能为 0对稀疏文件则不含空洞字节。它不等于磁盘占用blocks × blocksize也不受压缩文件系统影响。容易踩的坑是把它当成“磁盘占用”结果在 ZFS/Btrfs 压缩卷或 NTFS 压缩文件上发现实际写入空间远小于 Size() 返回值。立即学习“go语言免费学习笔记深入”需要真实磁盘用量Go 标准库不提供跨平台接口Linux 可用 syscall.Stat_t.Blocks 乘以 512但需 cgo 或 exec du读取前校验大小别只靠 Size() 防止 OOM——某些文件如 /proc/kcore报告极大 size 却无法全读应配合流式读取 限长注意Size() 对目录也返回 0POSIX 行为不能用它判断目录是否为空os.ReadDir 比 filepath.Walk 更快但不递归如果你只要当前目录下文件名和基础属性名字、是否是目录、修改时间、大小os.ReadDir 比 filepath.Walk 快 2–5 倍因为它一次系统调用读取整个目录且默认不解析 symlink 目标避免 stat 开销。 Mokker AI AI产品图添加背景

更多文章