自动化管理文件和文件夹
遍历文件夹
遍历文件夹及子文件夹
包名:path/filepath
原型:func Walk(root string, walkFn WalkFunc) error
作用:Walk
函数会遍历 root
指定的目录下的文件树,对每一个该文件树中的目录和文件都会调用 walkFn
,包括 root
自身。所有访问文件 /
目录时遇到的错误都会传递给 walkFn
过滤。文件是按词法顺序遍历的,这让输出更漂亮,但也导致处理非常大的目录时效率会降低。Walk
函数不会遍历文件树中的符号链接(快捷方式)文件包含的路径。
包名:path/filepath
原型: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
函数照常执行处理下一个文件。
示例:
package mainimport ("fmt""os""path/filepath"
)func walkFunc(path string, info os.FileInfo, err error) error {fmt.Printf("%s\n", path)return nil
}func main() {filepath.Walk(`F:\blog`, walkFunc)
}
普通遍历文件夹
示例:
package mainimport ("fmt""os"
)func main() {f, err := os.Open(`F:\blog\officeauto`)if err != nil {panic(err)}fs, err := f.Readdir(0)if err != nil {panic(err)}for _, f := range fs {fmt.Println(f.Name())}}
示例:
package mainimport ("fmt""io/ioutil"
)func main() {fs, err := ioutil.ReadDir(`F:\blog\officeauto`)if err != nil {panic(err)}for _, f := range fs {fmt.Println(f.Name())}}
递归遍历文件夹
示例:
package mainimport ("fmt""io/ioutil"
)func WalkDir(filepath string, level int) ([]string, error) {prefix :&#61; "|"for i :&#61; 0; i < level; i&#43;&#43; {prefix &#43;&#61; "------"}files, err :&#61; ioutil.ReadDir(filepath)if err !&#61; nil {return nil, err}var allfile []stringfor _, v :&#61; range files {fullPath :&#61; filepath &#43; "\\" &#43; v.Name()if v.IsDir() {allfile &#61; append(allfile, prefix &#43; v.Name())a, _ :&#61; WalkDir(fullPath, level &#43; 1)allfile &#61; append(allfile, a...)} else {allfile &#61; append(allfile, prefix &#43; v.Name())}}return allfile, nil
}func main() {files, _ :&#61; WalkDir(&#96;F:\blog&#96;, 1)for _, v :&#61; range files {fmt.Println(v)}
}