Go 列出目录
最后修改时间 2024 年 4 月 11 日
Go 列出目录展示了如何在 Golang 中列出目录内容。
目录定义
目录是计算机文件系统中用于存储和定位文件的单元。目录以树状结构进行分层组织。目录具有父子关系。目录有时也称为文件夹。
在 Go 中,我们可以使用 `ioutil.ReadDir`、`filepath.Walk` 或 `filepath.Glob` 来列出目录。
使用 ioutil.ReadDir 列出 Go 目录
`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` 确定。列表是非递归的。
按扩展名列出 Go 文件
`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` 文件。
列出 Go 目录
可以使用 `FileInfo` 的 `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()) } } }
该示例仅列出主目录中的文件。
使用 filepath.Glob 列出 Go 目录
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 列出 Go 目录
对于递归目录列表,我们可以使用 `filepath.Walk` 函数。
func Walk(root string, walkFn WalkFunc) error
该函数遍历以 root 为根的文件树,为树中的每个文件或目录调用 `walkFn`,包括 root。访问文件和目录的所有错误都由 `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` 函数确定。
列出 Go 大文件
以下示例使用 `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 中的目录内容。