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 中的目录内容。