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'sIsDir可用于将列表限制为仅文件或目录。
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教程。
