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教程。
