如何在 Go 中列出目录中的文件
在 Go (Golang) 中,当涉及到使用标准库时,我们通常有很多选择来实现相同的结果。 在本文中,我们将分解一个可能的选项列表,我们可以使用这些选项使用 Go 列出目录中的文件。 我们还将看到如何在具有嵌套目录结构时仅通过使用 Go 标准库递归地列出文件。 到本文结束时,我们将能够使用以下所有选项列出目录中的文件
- ioutil.ReadDir
- filepath.Walk
- os.File.Readdir
选项 1:ioutil.ReadDir
ioutil.ReadDir
来自于 Go 标准库中的 ioutil
包,可以查看 Go Doc 官网的文档
func ReadDir(dirname string) ([]os.FileInfo, error)
ReadDir
读取由dirname
命名的目录并返回按文件名排序的目录条目列表。
让我们看看如何在这个例子中实际使用 ioutil.ReadDir
package main
import (
"fmt"
"io/ioutil"
"log"
)
func main() {
files, err := ioutil.ReadDir("/tmp/")
if err != nil {
log.Fatal(err)
}
for _, file := range files {
fmt.Println(file.Name(), file.IsDir())
}
}
这就是我的输出
com.apple.launchd.Uzc3xBHlg5 true
fseventsd-uuid false
powerlog true
tmux-501 true
如果我们想了解更多关于如何使用此函数的输出的信息,我们可以查看 os.FileInfo
的结构,它允许我们查看返回的文件或目录的属性。
选项 2:filepath.Walk
filepath.Walk
是另一个可用于在目录结构中列出文件的选项,来自 filepath
Go 包,它还允许我们递归地发现目录和文件。 官方文档是这样写的
func Walk(root string, walkFn WalkFunc) error
Walk
遍历以 root 为根的文件树,为树中的每个文件或目录调用walkFn
,包括 root。 访问文件和目录时出现的所有错误都由walkFn
过滤。 文件按词法顺序遍历,这使得输出具有确定性,但意味着对于非常大的目录,遍历可能效率低下。Walk
不遵循符号链接。
WalkFunc
是为 Walk 访问的每个文件或目录调用的函数类型。 这是函数签名
type WalkFunc func(path string, info os.FileInfo, err error) error
下面是一个关于如何使用 filepath.Walk
来发现文件和目录的例子
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
err := filepath.Walk("/tmp/", func(path string, info os.FileInfo, err error) error {
if err != nil {
fmt.Println(err)
return err
}
fmt.Printf("dir: %v: name: %s\n", info.IsDir(), path)
return nil
})
if err != nil {
fmt.Println(err)
}
}
这是上面代码片段的预期输出
dir: true: name: /tmp/
dir: false: name: /tmp/00000000002b8a24
dir: false: name: /tmp/00000000002c3e48
dir: false: name: /tmp/00000000002d25ea
dir: true: name: /tmp/com.apple.launchd.Uzc3xBHlg5
dir: false: name: /tmp/com.apple.launchd.Uzc3xBHlg5/Listeners
dir: false: name: /tmp/fseventsd-uuid
dir: true: name: /tmp/powerlog
dir: true: name: /tmp/tmux-501
dir: false: name: /tmp/tmux-501/default
选项 3:os.File.Readdir
最后一个选项是在从文件系统读取文件时仅使用来自 os.File
的文件指针。 该包是Go标准库中的os包。
func (f *File) Readdir(n int) ([]FileInfo, error)
Readdir 读取与文件关联的目录的内容,并返回一个包含最多 n 个
FileInfo
值的切片,就像 Lstat 按目录顺序返回的一样。 对同一文件的后续调用将产生更多的 FileInfo。 如果n > 0
,Readdir 最多返回 n 个 FileInfo 结构。 在这种情况下,如果 Readdir 返回一个空切片,它将返回一个非零错误来解释原因。 在目录末尾,错误是 io.EOF。 如果n <= 0
,则 Readdir 在单个切片中返回目录中的所有 FileInfo
以下是有关如何使用 os.File.Readdir
列出给定目录中的文件的示例
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("/tmp")
if err != nil {
fmt.Println(err)
return
}
files, err := f.Readdir(0)
if err != nil {
fmt.Println(err)
return
}
for _, v := range files {
fmt.Println(v.Name(), v.IsDir())
}
}
这是上述代码片段的预期输出
00000000002b8a24 false
fseventsd-uuid false
powerlog true
com.apple.launchd.Uzc3xBHlg5 true
00000000002c3e48 false
00000000002d25ea false
tmux-501 true
相关文章
在 Golang 中使用 If-Else 和 Switch Loop Inside HTML 模板
发布时间:2023/04/27 浏览次数:65 分类:Go
-
本篇文章介绍了在 Golang 的 HTML 模板中使用 if-else 和 switch 循环。因此,只要输出是 HTML,就应该始终使用 HTML 模板包而不是文本模板。
Golang 中的零值 Nil
发布时间:2023/04/27 浏览次数:166 分类:Go
-
本篇文章介绍 nil 在 Golang 中的含义,nil 是 Go 编程语言中的零值,是众所周知且重要的预定义标识符。
Golang 中的 Lambda 表达式
发布时间:2023/04/27 浏览次数:93 分类:Go
-
本篇文章介绍如何在 Golang 中创建 lambda 表达式。Lambda 表达式似乎不存在于 Golang 中。 函数文字、lambda 函数或闭包是匿名函数的另一个名称。
在 Go 中使用断言
发布时间:2023/04/27 浏览次数:181 分类:Go
-
本篇文章介绍了 assert 在 GoLang 中的使用。在 Go 语言中使用断言:GoLang 不提供对断言的任何内置支持,但我们可以使用来自 Testify API 的广泛使用的第三方包断言。
Go 中的随机数生成
发布时间:2023/04/27 浏览次数:114 分类:Go
-
本篇文章介绍如何在 Go 语言中使用随机数生成功能。Go 中的随机数生成 Go 语言为随机数生成功能提供内置支持。 内置包 math 有方法 rand(),用于随机数生成。
在 Go 中使用 Electron API 创建 GUI
发布时间:2023/04/27 浏览次数:124 分类:Go
-
本篇文章介绍如何在 Go 语言中使用 Electron API 创建 GUI。Electron API 或 Astilectron 用于为 GoLang 创建 GUI。
在 GoLang 中安装包
发布时间:2023/04/27 浏览次数:122 分类:Go
-
使用 Go 语言的 get 命令安装所需的包非常容易。 Go 语言提供了多种命令来执行某些任务,get 就是其中之一。