在《Go语言100个实战案例》中的 文件与IO操作篇 - 案例18:遍历目录下所有文件 的完整内容,帮助你掌握如何用 Go 遍历整个文件目录树,包括子目录中的所有文件。
🎯 案例目标
使用 Go 语言遍历指定目录,递归地列出该目录及其所有子目录下的所有文件路径。
🧩 应用场景
- • 文件备份、文件管理工具开发
- • 查找某种类型的文件(如
.jpg
,.txt
) - • 批量处理目录下文件,如格式转换或分析
🧠 涉及知识点
- • 使用
filepath.WalkDir()
遍历目录结构 - • 判断文件类型(文件或文件夹)
- • 获取文件相对/绝对路径
- • 错误处理
💻 示例代码:递归遍历目录下所有文件
go
package main
import (
"fmt"
"io/fs"
"path/filepath"
)
func main() {
root := "./testfiles" // 要遍历的目录
err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error {
if err != nil {
fmt.Println("访问出错:", err)
return err
}
// 判断是否为文件
if !d.IsDir() {
fmt.Println("文件:", path)
}
return nil
})
if err != nil {
fmt.Println("遍历失败:", err)
}
}
🖼️ 示例目录结构
css
testfiles/
├── a.txt
├── b.jpg
├── docs/
│ ├── c.pdf
│ └── d.docx
📤 执行输出示例
bash
文件: testfiles/a.txt
文件: testfiles/b.jpg
文件: testfiles/docs/c.pdf
文件: testfiles/docs/d.docx
🛠 技术说明
函数 | 作用 |
---|---|
filepath.WalkDir() |
遍历目录树 |
fs.DirEntry |
提供文件信息结构 |
d.IsDir() |
判断是否是文件夹 |
path |
每个文件或文件夹的完整路径 |
🔄 拓展示例:只打印特定类型文件
lua
if !d.IsDir() && filepath.Ext(path) == ".txt" {
fmt.Println("TXT 文件:", path)
}
🧪 拓展练习
- • 获取每个文件的大小并打印
- • 将结果写入日志文件
- • 忽略特定文件夹(如
.git/
) - • 改为使用
os.ReadDir
+ 递归方式实现
✅ 小结
本案例帮助你学会了如何在 Go 中递归遍历整个文件目录结构。filepath.WalkDir
是处理目录树的利器,适用于各种需要深入访问文件系统的实际开发任务。