Go查找文件教程展示了如何使用filepath.Walk查找文件。
filepath
包实现了用于操作文件名路径的实用例程。
filepath.Walk
遍历文件树,为树中的每个文件或目录(包括根目录)调用指定的函数。该函数递归遍历所有子目录。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
去查找文本文件
在第一个示例中,我们搜索文本文件。
package main import ( "fmt" "log" "os" "path/filepath" ) func main() { var files []string root := "/home/janbodnar/Documents" err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { if err != nil { fmt.Println(err) return nil } if !info.IsDir() && filepath.Ext(path) == ".txt" { files = append(files, path) } return nil }) if err != nil { log.Fatal(err) } for _, file := range files { fmt.Println(file) } }
在代码示例中,我们搜索扩展名为.txt
的文件。
var files []string
匹配的文件存储在files
切片中。
root := "/home/janbodnar/Documents"
这是我们开始搜索的根目录。
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
filepath.Walk
的第一个参数是根目录。第二个参数是walk函数;filepath.Walk
调用的函数来访问每个文件或目录。
if err != nil { fmt.Println(err) return nil }
如果有错误则打印错误,但继续在别处搜索。
if !info.IsDir() && filepath.Ext(path) == ".txt" { files = append(files, path) }
如果文件不是目录且扩展名为.txt
,我们将文件附加到files
切片。
for _, file := range files { fmt.Println(file) }
最后,我们遍历files
切片并将所有匹配的文件打印到控制台。
按大小查找文件
在下一个示例中,我们按大小查找文件。
package main import ( "fmt" "log" "os" "path/filepath" ) var files []string func VisitFile(path string, info os.FileInfo, err error) error { if err != nil { fmt.Println(err) return nil } file_size := info.Size() if !info.IsDir() && file_size > 1024*1024 { files = append(files, path) } return nil } func main() { root := "/home/janbodnar/Documents" err := filepath.Walk(root, VisitFile) if err != nil { log.Fatal(err) } for _, file := range files { fmt.Println(file) } }
该示例列出了大小大于1MB的文件。
file_size := info.Size()
使用Size
方法,我们确定文件的大小(以字节为单位)。
if !info.IsDir() && file_size > 1024*1024 { files = append(files, path) }
如果文件不是目录并且其大小大于1MB,我们将文件添加到files
切片。
按修改时间查找文件
在下一个示例中,我们按修改时间查找文件。
package main import ( "fmt" "log" "os" "path/filepath" "time" ) func FindFilesAfter(dir string, t time.Time) (files []string, err error) { err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { if err != nil { fmt.Println(err) return nil } if !info.IsDir() && filepath.Ext(path) == ".txt" && info.ModTime().After(t) { files = append(files, path) } return nil }) return } func main() { root := "/home/janbodnar/Documents" t, err := time.Parse("2006-01-02T15:04:05-07:00", "2021-05-01T00:00:00+00:00") if err != nil { log.Fatal(err) } files, err := FindFilesAfter(root, t) if err != nil { log.Fatal(err) } for _, file := range files { fmt.Println(file) } }
我们找到了2021年5月1日之后修改过的所有文本文件。
if !info.IsDir() && filepath.Ext(path) == ".txt" && info.ModTime().After(t) { files = append(files, path) }
ModTime
给出文件的最后修改时间。使用After
函数,我们检查时间点是否在给定时间之后。
通过正则表达式模式查找文件
在下面的示例中,我们根据正则表达式搜索文件名。
package main import ( "fmt" "log" "os" "path/filepath" "regexp" ) var files []string func VisitFile(path string, info os.FileInfo, err error) error { if err != nil { fmt.Println(err) return nil } if info.IsDir() || filepath.Ext(path) != ".txt" { return nil } reg, err2 := regexp.Compile("^[la]") if err2 != nil { return err2 } if reg.MatchString(info.Name()) { files = append(files, path) } return nil } func main() { err := filepath.Walk("/home/janbodnar/Documents", VisitFile) if err != nil { log.Fatal(err) } for _, file := range files { fmt.Println(file) } }
在代码示例中,我们搜索以字母l或字母a开头的文本文件。
reg, err2 := regexp.Compile("^[la]")
我们使用regexp.Compile
编译一个正则表达式。
if reg.MatchString(info.Name()) { files = append(files, path) }
如果正则表达式与文件名匹配,我们将文件添加到files
切片。
在本教程中,我们使用filepath.Walk
在Golang中搜索文件。
列出所有Go教程。