我一直在尝试如何在Go中简单地列出单个目录中的文件和文件夹。
我找到文件路径了。Walk,但它会自动进入子目录,这是我不想要的。我其他的搜索都没有更好的结果。
我相信这个功能是存在的,但它真的很难找到。如果有人知道我该去哪里找,请告诉我。谢谢。
我一直在尝试如何在Go中简单地列出单个目录中的文件和文件夹。
我找到文件路径了。Walk,但它会自动进入子目录,这是我不想要的。我其他的搜索都没有更好的结果。
我相信这个功能是存在的,但它真的很难找到。如果有人知道我该去哪里找,请告诉我。谢谢。
当前回答
使用Readdirnames递归打印目录中所有文件的完整示例
package main
import (
"fmt"
"os"
)
func main() {
path := "/path/to/your/directory"
err := readDir(path)
if err != nil {
panic(err)
}
}
func readDir(path string) error {
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
names, _ := file.Readdirnames(0)
for _, name := range names {
filePath := fmt.Sprintf("%v/%v", path, name)
file, err := os.Open(filePath)
if err != nil {
return err
}
defer file.Close()
fileInfo, err := file.Stat()
if err != nil {
return err
}
fmt.Println(filePath)
if fileInfo.IsDir() {
readDir(filePath)
}
}
return nil
}
其他回答
您可以尝试使用操作系统包中的ReadDir功能。根据文档:
ReadDir读取已命名的目录,返回按文件名排序的所有目录条目。
生成的切片包含os。DirEntry类型,它们提供了这里列出的方法。下面是一个基本的例子,列出了当前目录中所有东西的名称(包含文件夹,但没有特别标记-你可以使用IsDir()方法检查一个项目是否为文件夹):
package main
import (
"fmt"
"os"
"log"
)
func main() {
entries, err := os.ReadDir("./")
if err != nil {
log.Fatal(err)
}
for _, e := range entries {
fmt.Println(e.Name())
}
}
ioutil。ReadDir是一个很好的发现,但是如果你点击并查看源代码,你会看到它调用os.File的ReadDir方法。如果您对目录顺序没有问题,并且不需要对列表排序,那么这个Readdir方法就是您所需要的全部。
更简单的是,使用path/filepath:
package main
import (
"fmt"
"log"
"path/filepath"
)
func main() {
files, err := filepath.Glob("*")
if err != nil {
log.Fatal(err)
}
fmt.Println(files) // contains a list of all files in the current directory
}
我们可以使用各种golang标准库函数获得文件系统上某个文件夹中的文件列表。
filepath。走 ioutil。ReadDir os.File.Readdir
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"path/filepath"
)
func main() {
var (
root string
files []string
err error
)
root := "/home/manigandan/golang/samples"
// filepath.Walk
files, err = FilePathWalkDir(root)
if err != nil {
panic(err)
}
// ioutil.ReadDir
files, err = IOReadDir(root)
if err != nil {
panic(err)
}
//os.File.Readdir
files, err = OSReadDir(root)
if err != nil {
panic(err)
}
for _, file := range files {
fmt.Println(file)
}
}
使用filepath。走
path/filepath包提供了一种方便的方式来扫描所有文件 在一个目录中,它会自动扫描每个子目录中的 目录中。
func FilePathWalkDir(root string) ([]string, error) {
var files []string
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if !info.IsDir() {
files = append(files, path)
}
return nil
})
return files, err
}
使用ioutil。ReadDir
ioutil。ReadDir读取以dirname命名的目录,并返回 按文件名排序的目录条目列表。
func IOReadDir(root string) ([]string, error) {
var files []string
fileInfo, err := ioutil.ReadDir(root)
if err != nil {
return files, err
}
for _, file := range fileInfo {
files = append(files, file.Name())
}
return files, nil
}
使用os.File.Readdir
Readdir读取与文件和关联的目录的内容 返回最多n个FileInfo值的切片,就像返回 Lstat,按目录顺序。对同一文件的后续调用将会 yield进一步的fileinfo。
func OSReadDir(root string) ([]string, error) {
var files []string
f, err := os.Open(root)
if err != nil {
return files, err
}
fileInfo, err := f.Readdir(-1)
f.Close()
if err != nil {
return files, err
}
for _, file := range fileInfo {
files = append(files, file.Name())
}
return files, nil
}
基准测试结果。
在这篇博客文章中获得更多细节
从您的描述中,您可能需要的是os.Readdirnames。
func (f *File) Readdirnames(n int) (names[]字符串,err错误) Readdirnames读取与file相关的目录的内容,并按目录顺序返回该目录中最多n个文件名的切片。对同一文件的后续调用将产生更多的名称。 ... 如果n <= 0, Readdirnames在一个切片中返回目录中的所有名称。
代码片段:
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
names, err := file.Readdirnames(0)
if err != nil {
return err
}
fmt.Println(names)
归功于SquattingSlavInTracksuit的评论;如果可以的话,我会建议将他们的评论提升为一个答案。