使用filepath.Walk可递归遍历目录,os.ReadDir用于非递归列出文件,结合file.Info判断类型,通过filepath.Ext过滤特定格式,返回filepath.SkipDir跳过指定子目录。

在Go语言中实现目录遍历,主要依赖标准库中的 os 和 path/filepath 包。最常用的方式是使用 filepath.Walk 函数,它可以递归遍历指定目录下的所有子目录和文件。
filepath.Walk 接受一个起始路径和一个处理函数,对每个访问的文件或目录调用该函数。你可以在这个函数中判断是文件还是目录,并执行相应逻辑。
示例代码:
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
root := "/path/to/your/directory" // 替换为实际路径
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
fmt.Printf("访问 %s 时出错: %v\n", path, err)
return nil // 返回 nil 继续遍历,返回 err 则停止
}
if info.IsDir() {
fmt.Printf("[DIR] %s\n", path)
} else {
fmt.Printf("[FILE] %s (大小: %d bytes)\n", path, info.Size())
}
return nil
})
if err != nil {
fmt.Printf("遍历失败: %v\n", err)
}
}如果你只需要列出某个目录下的内容而不进入子目录,可以使用 os.ReadDir(推荐)或 os.Open + Readdir。
立即学习“go语言免费学习笔记(深入)”;
示例:使用 os.ReadDir
files, err := os.ReadDir("/path/to/dir")
if err != nil {
fmt.Printf("读取目录失败: %v\n", err)
return
}
for _, file := range files {
if file.IsDir() {
fmt.Printf("[DIR] %s\n", file.Name())
} else {
info, _ := file.Info()
fmt.Printf("[FILE] %s (%d bytes)\n", file.Name(), info.Size())
}
}你可以在遍历过程中加入条件判断,例如只处理 .txt 文件。
filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
return nil
}
if !info.IsDir() && filepath.Ext(path) == ".txt" {
fmt.Printf("找到文本文件: %s\n", path)
}
return nil
})如果想跳过特定目录(如 node_modules),可以在回调中判断并返回 filepath.SkipDir。
filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
return nil
}
if info.IsDir() && info.Name() == "node_modules" {
return filepath.SkipDir // 跳过该目录
}
fmt.Println(path)
return nil
})基本上就这些。根据需求选择递归或非递归方式,结合文件信息判断类型和属性,就能灵活实现目录遍历功能。
以上就是如何使用Golang实现目录遍历的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号