最直接可靠的方式是os.stat配合fileinfo.isdir(),但必须先检查err是否为nil,否则fi为nil时调用isdir会panic;isdir返回false不表示是普通文件,还可能是符号链接、设备文件等,需用fi.mode()位运算进一步判断。

os.Stat + FileInfo.IsDir() 是最直接、最可靠的方式,但必须先处理错误,否则会 panic 或误判。
os.Stat 后必须检查 err,不能跳过
很多人写成 fi, _ := os.Stat(path); if fi.IsDir() { ... },这是危险的。如果路径不存在、权限不足或被挂载中断,os.Stat 返回 err != nil 且 fi == nil,此时调用 fi.IsDir() 会 panic。
- 务必先判断
err:用if err != nil分支处理 - 若需区分“不存在”和“其他错误”,用
os.IsNotExist(err) - 不要对
nil的fi做任何方法调用
IsDir() 为 false 不代表就是普通文件
fi.IsDir() 返回 false,只说明它不是目录类型 inode,但可能是符号链接、命名管道、套接字、设备文件,甚至特殊文件系统对象(如 /proc/1/exe)。
- 要严格分类,得用
fi.Mode() & os.ModeType位运算比对 - 例如判断是否为普通文件:
fi.Mode().IsRegular() - 判断是否为符号链接:
fi.Mode()&os.ModeSymlink != 0 - 想兼容所有平台,优先用
fs.Mode*常量(Go 1.16+ 推荐)
符号链接场景下该用 os.Lstat 还是 os.Stat
默认 os.Stat 会跟随符号链接——如果 /tmp/mydir 是个指向真实目录的软链,os.Stat 返回的是目标目录的 FileInfo,IsDir() 为 true;但如果只想知道“这个路径本身是不是一个目录类型的链接”,就得用 os.Lstat。
- 检查“路径所指内容是否为目录” → 用
os.Stat - 检查“路径自身是否为目录(而非链接)” → 用
os.Lstat -
os.Lstat在 Windows 上行为与 Unix 不同,注意跨平台一致性
真正容易被忽略的点是:哪怕 os.Stat 成功、IsDir() 为 true,也不能保证你接下来能 os.ReadDir 或 os.Open 它——权限、挂载状态、NFS 超时都可能在下一步才暴露问题。类型判断只是第一道门,不是访问许可的担保。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











