golang - 遍历目录内容
简介
在Go语言里面,提供了path/filepath这个包,可以方便我们遍历目录。
需求:现在需要找出目录的.html文件
标准库
type WalkFunc func(path string, info os.FileInfo, err error) error
Walk函数对每一个文件/目录都会调用WalkFunc函数类型值。调用时path参数会包含Walk的root参数作为前缀;就是说,如果Walk函数的root为"dir",该目录下有文件"a",将会使用"dir/a"调用walkFn参数。walkFn参数被调用时的info参数是path指定的地址(文件/目录)的文件信息,类型为os.FileInfo。
如果遍历path指定的文件或目录时出现了问题,传入的参数err会描述该问题,WalkFunc类型函数可以决定如何去处理该错误(Walk函数将不会深入该目录);如果该函数返回一个错误,Walk函数的执行会中止;只有一个例外,如果Walk的walkFn返回值是SkipDir,将会跳过该目录的内容而Walk函数照常执行处理下一个文件。
func Walk(root string, walkFn WalkFunc) error
Walk函数会遍历root指定的目录下的文件树,对每一个该文件树中的目录和文件都会调用walkFn,包括root自身。所有访问文件/目录时遇到的错误都会传递给walkFn过滤。文件是按词法顺序遍历的,这让输出更漂亮,但也导致处理非常大的目录时效率会降低。Walk函数不会遍历文件树中的符号链接(快捷方式)文件包含的路径。
代码
package main
import (
"flag"
"fmt"
"os"
"path/filepath"
"strings"
)
func getFilelist(path string, stuffix string) (files []string) {
err := filepath.Walk(path, func(path string, f os.FileInfo, err error) error {
if f == nil {
return err
}
if f.IsDir() {
return nil
}
if strings.HasSuffix(path, stuffix) {
files = append(files, path)
}
return nil
})
if err != nil {
fmt.Printf("filepath.Walk() returned %v\n", err)
}
return
}
func main() {
flag.Parse()
root := flag.Arg(0)
// 设置默认遍历当前目录
if root == "" {
root = "./"
}
fmt.Println(getFilelist(root, ".html"))
}