Golistdirectory显示如何在Golang中列出目录内容。
目录定义
目录是计算机文件系统中用于存储和定位文件的单位。目录按层次结构组织成树。目录具有父子关系。目录有时也称为文件夹。
在Go中,我们可以使用ioutil.ReadDir
、filepath.Walk
或filepath.Glob
列出目录。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
使用ioutil.ReadDir去列出目录
ioutil.ReadDir
读取目录并返回按文件名排序的目录条目列表。
func ReadDir(dirname string) ([]os.FileInfo, error)
这是ReadDir
函数的语法。
package main import ( "fmt" "io/ioutil" "log" "os" ) func main() { home, err := os.UserHomeDir() if err != nil { log.Fatal(err) } files, err := ioutil.ReadDir(home) if err != nil { log.Fatal(err) } for _, f := range files { fmt.Println(f.Name()) } }
该示例读取用户主目录内容。主用户目录由os.UserHomeDir
确定。该列表是非递归的。
按扩展名列出文件
filepath.Ext
返回路径使用的文件扩展名。
package main import ( "fmt" "io/ioutil" "log" "path/filepath" ) func main() { path := "/home/janbodnar/Documents/" files, err := ioutil.ReadDir(path) if err != nil { log.Fatal(err) } for _, f := range files { if filepath.Ext(f.Name()) == ".txt" { fmt.Println(f.Name()) } } }
该示例显示了Documents
目录中的所有.txt
文件。
去列出目录
FileInfo's
IsDir
可用于将列表限制为仅文件或目录。
package main import ( "fmt" "io/ioutil" "log" "os" ) func main() { home, err := os.UserHomeDir() if err != nil { log.Fatal(err) } files, err := ioutil.ReadDir(home) if err != nil { log.Fatal(err) } for _, f := range files { if !f.IsDir() { fmt.Println(f.Name()) } } }
该示例仅列出主目录中的文件。
Golistdirectorywithfilepath.Glob
filepath.Glob
返回所有匹配模式的文件的名称,如果没有匹配的文件,则返回nil
。
func Glob(pattern string) (matches []string, err error)
这是filepath.Glob
函数的语法。
package main import ( "fmt" "log" "path/filepath" ) func main() { files, err := filepath.Glob("/root/Documents/prog/golang/**/*.go") if err != nil { log.Fatal(err) } for _, file := range files { fmt.Println(file) } }
该示例列出了给定目录中的所有Go文件。使用**
模式,列表是递归的。
使用filepath.Walk去列出目录
对于递归目录列表,我们可以使用filepath.Walk
函数。
func Walk(root string, walkFn WalkFunc) error
该函数遍历以根为根的文件树,为树中的每个文件或目录调用walkFn
,包括根目录。walkFn
过滤来自访问文件和目录的所有错误。
package main import ( "fmt" "log" "os" "path/filepath" ) func main() { err := filepath.Walk("/home/janbodnar/Documents/prog/golang/", func(path string, info os.FileInfo, err error) error { if err != nil { return err } fmt.Println(path, info.Size()) return err }) if err != nil { log.Println(err) } }
该示例递归地遍历给定的目录。它输出每个路径名称和大小。
Go目录大小
以下示例使用filepath.Walk
函数获取给定目录中所有文件的大小。不包括目录大小。
package main import ( "fmt" "log" "os" "path/filepath" ) func main() { var size int64 path := "/home/janbodnar/Documents/prog/golang/" err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() { size += info.Size() } return err }) if err != nil { log.Println(err) } fmt.Printf("The directory size is: %d\n", size) }
该示例使用IsDir
函数从目录中区分文件。文件的大小由Size
函数确定。
列出大文件
以下示例使用filepath.Walk
输出大文件。
package main import ( "fmt" "log" "os" "path/filepath" ) func main() { var files []string var limit int64 = 1024 * 1024 * 1024 path := "/home/janbodnar/Downloads/" err := filepath.Walk(path, func(path string, info os.FileInfo, err error) error { if err != nil { return err } if info.Size() > limit { files = append(files, path) } return err }) if err != nil { log.Println(err) } for _, file := range files { fmt.Println(file) } }
在代码示例中,我们列出了Downloads
目录中所有大于1GB的文件。
在本教程中,我们列出了Go中的目录内容。
列出所有Go教程。