📁 在Go中列出一个目录中的文件

658 阅读1分钟

Go标准库有许多函数可以列出文件夹中的文件。你可以只列出一个文件夹的顶层内容,或者在一个嵌套的目录结构中递归地浏览所有的文件和目录,也可以列出与特定模式相匹配的文件。

在所有的例子中,我们使用文件夹树。

testFolder
├── file1.go
├── file2.txt
└── folder1
└── fileInFolder1.txt

通过使用以下方法列出一个目录中的文件 ioutil.ReadDir

使用 ioutil.ReadDir当你想检索目录树顶层的文件时,可以使用这个方法。

package main
import (
"fmt"
"io/ioutil"
"log"
)
func main() {
files, err := ioutil.ReadDir("testFolder")
if err != nil {
log.Fatal(err)
}
for _, f := range files {
fmt.Println(f.Name())
}
}

输出。

file1.go
file2.txt
folder1

通过使用以下方法列出一个目录中的文件 os.File.Readdir

该函数 os.File.Readdir的工作方式与 ioutil.ReadDir的方法一样,但它不按名称对结果列表进行排序。

package main
import (
"fmt"
"log"
"os"
)
func main() {
dir, err := os.Open("testFolder")
if err != nil {
log.Fatal(err)
}
files, err := dir.Readdir(-1)
if err != nil {
log.Fatal(err)
}
for _, f := range files {
fmt.Println(f.Name())
}
}

输出。

file2.txt
file1.txt
folder1

递归地列出文件 filepath.Walk

Go 提供了一个方便的函数 filepath.Walk(root string, fn WalkFunc) error来递归地列出文件。它从root 文件夹开始,对树中的每个文件和目录调用 fn WalkFunc函数,对树中的每个文件和目录按词法顺序调用。

package main
import (
"fmt"
"log"
"os"
"path/filepath"
)
func main() {
err := filepath.Walk("testFolder",
func(path string, _ os.FileInfo, err error) error {
if err != nil {
return err
}
fmt.Println(path)
return nil
})
if err != nil {
log.Fatal(err)
}
}

输出:输出。

testFolder
testFolder/file1.go
testFolder/file2.txt
testFolder/folder1
testFolder/folder1/fileInFolder1.txt

通过以下方式列出符合给定模式的文件 filepath.Glob

如果你只对符合给定模式的文件感兴趣,你可以使用 filepath.Glob,例如,列出所有扩展名为.go 🙂的文件。模式的语法可以在这里找到。

package main
import (
"fmt"
"log"
"path/filepath"
)
func main() {
files, err := filepath.Glob("testFolder/*.go")
if err != nil {
log.Fatal(err)
}
for _, file := range files {
fmt.Println(file)
}
}

输出。

testFolder/file1.go