Golang程序搜索目录中的文件
在开发Golang程序时,经常需要搜索指定目录下的文件,比如我们需要找到某个目录中的所有.log文件,或者以某个关键字命名的文件,那么如何实现文件搜索功能呢?
方案一:使用filepath.Walk函数
Go的标准库中提供了filepath.Walk函数,可以遍历目录树中的所有文件和目录。我们只需要实现一个回调函数,每当遍历到一个文件时就调用,实现对该文件的操作即可。
示例代码:
package main
import (
"fmt"
"os"
"path/filepath"
)
func walkFunc(path string, info os.FileInfo, err error) error {
if err != nil {
// 错误处理
return err
}
if !info.IsDir() {
// 处理文件
fmt.Println(path)
}
return nil
}
func main() {
// 遍历当前目录下的所有文件
root := "."
err := filepath.Walk(root, walkFunc)
if err != nil {
fmt.Println(err)
}
}
运行结果:
./test.txt
./main.go
./README.md
可以看到,该程序成功遍历了当前目录下的所有文件,并打印了文件路径。
但是,我们还需要对文件进行筛选,只输出符合条件的文件。
方案二:使用filepath.Glob函数
Go的标准库中还提供了filepath.Glob函数,它可以根据通配符匹配符合条件的所有文件。
示例代码:
package main
import (
"fmt"
"path/filepath"
)
func main() {
// 匹配当前目录下所有的txt文件
files, err := filepath.Glob("./*.txt")
if err != nil {
fmt.Println(err)
}
for _, file := range files {
fmt.Println(file)
}
}
运行结果:
./test.txt
可以看到,该程序成功输出了当前目录下的所有txt文件路径。
方案三:使用filepath.Walk函数结合文件名过滤器实现筛选
结合方案一和方案二,我们可以自定义一个文件名过滤器函数,使用Walk函数遍历目录中的所有文件,并筛选符合条件的文件输出。
示例代码:
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
)
func walkFunc(path string, info os.FileInfo, err error) error {
if err != nil {
// 错误处理
return err
}
if !info.IsDir() && strings.Contains(path, ".txt") {
// 处理符合条件的文件
fmt.Println(path)
}
return nil
}
func main() {
// 遍历当前目录下所有的txt文件路径
root := "."
err := filepath.Walk(root, walkFunc)
if err != nil {
fmt.Println(err)
}
}
运行结果:
./test.txt
可以看到,该程序成功输出了当前目录中的所有txt文件路径。
结论
通过使用方案一、方案二和方案三中的方法,我们可以轻松实现对目录中文件的搜索和筛选功能。针对具体需求,可以选择不同的实现方式,方便快捷。
极客笔记