本文将展示如何列出目录内容。
列出目录
Golang 版本
1.12.1
前言
本文将展示如何列出目录内容。
实现
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
)
func main() {
fmt.Println("List by ReadDir")
listDirByReadDir(".")
fmt.Println()
fmt.Println("List by Walk")
listDirByWalk(".")
}
func listDirByWalk(path string) {
filepath.Walk(path, func(wPath string, info os.FileInfo,
err error) error {
if wPath == path {
return nil
}
if info.IsDir() {
fmt.Printf("[%s]\n", wPath)
return filepath.SkipDir
}
if wPath != path {
fmt.Println(wPath)
}
return nil
})
}
func listDirByReadDir(path string) {
lst, err := ioutil.ReadDir(path)
if err != nil {
panic(err)
}
for _, val := range lst {
if val.IsDir() {
fmt.Printf("[%s]\n", val.Name())
} else {
fmt.Println(val.Name())
}
}
}
$ go run main.go
List by ReadDir
[folder]
main.go
List by Walk
[folder]
main.go
原理
列出上述示例的文件夹使用了两种方法。 第一个简单的方法是使用listDirByReadDir
函数实现,并使用ioutil
包中的ReadDir
函数。 此函数返回实际目录内容的FileInfo
结构片。 请注意,ReadDir
函数不会递归读取文件夹。 实际上,ReadDir
函数在内部使用os
包中的File
类型的Readdir
方法。
另一种方法,更复杂,listDirByWalk
使用filepath.Walk
函数,该函数遍历路径并具有处理任何给定路径中的每个文件或文件夹的函数。 主要区别在于Walk
函数以递归方式读取目录。 这种方法的核心部分是WalkFunc
类型,其功能是使用列表的结果。 请注意,该函数通过返回filepath.SkipDir
错误来阻止对基础文件夹的递归调用。 Walk
函数也首先处理被调用的路径,所以你也需要处理它(在这种情况下,我们跳过打印并返回nil,因为我们需要递归处理这个文件夹)。