使用filepath.Walk可高效递归遍历目录,结合os.FileInfo过滤文件类型并获取元数据,如跳过.git目录或仅处理.go文件,同时通过SkipDir提升性能。

在Go语言中实现文件夹遍历是一个常见需求,比如用于扫描日志目录、查找特定文件或统计项目代码行数。Golang提供了简洁而强大的标准库支持,主要通过 os 和 filepath 包来完成。
使用 filepath.Walk 遍历目录
Go中最常用的目录遍历方式是 filepath.Walk 函数。它会递归访问指定目录下的所有子目录和文件,并对每个条目执行传入的回调函数。
基本用法如下:
package mainimport ( "fmt" "log" "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 { log.Printf("无法访问 %s: %v", path, err) return nil // 返回nil继续遍历,返回err则中断 } fmt.Println(path) return nil }) if err != nil { log.Fatal(err) }}
在这个例子中,Walk 会对每个文件和目录调用匿名函数。参数说明:
立即学习“go语言免费学习笔记(深入)”;
path:当前条目的完整路径 info:os.FileInfo 类型,包含文件名、大小、是否为目录等信息 err:访问该条目时可能出现的错误
过滤文件类型或跳过目录
实际应用中我们通常只关心某些类型的文件,或者想跳过特定目录(如 .git 或 node_modules)。
可以通过检查 info.IsDir() 和文件扩展名来实现:
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { if err != nil { return nil } // 跳过目录 if info.IsDir() { dirName := info.Name() if dirName == ".git" || dirName == "node_modules" { return filepath.SkipDir // 跳过整个目录 } return nil } // 只处理 .go 文件 if filepath.Ext(path) == ".go" { fmt.Println("Go文件:", path) } return nil})
获取文件详细信息
利用 os.FileInfo 可以获取更多元数据:
info.Name():文件名 info.Size():文件大小(字节) info.ModTime():修改时间 info.Mode():权限模式 info.IsDir():是否为目录
例如打印所有 `.log` 文件的大小和修改时间:
if filepath.Ext(path) == ".log" { fmt.Printf("文件: %s | 大小: %d 字节 | 修改时间: %sn", path, info.Size(), info.ModTime())}
基本上就这些。filepath.Walk 简洁高效,适合绝大多数场景。注意处理权限不足或路径不存在的情况,避免程序崩溃。合理使用 SkipDir 能显著提升性能,特别是在大型项目中跳过不必要的依赖目录。
以上就是如何用Golang实现文件夹遍历_Golang 文件夹遍历实践的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1426498.html
微信扫一扫
支付宝扫一扫