如何在 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 浏览次数:101 分类:Go
-
本篇文章介绍了在 Golang 的 HTML 模板中使用 if-else 和 switch 循环。因此,只要输出是 HTML,就应该始终使用 HTML 模板包而不是文本模板。
Golang 中的零值 Nil
发布时间:2023/04/27 浏览次数:184 分类:Go
-
本篇文章介绍 nil 在 Golang 中的含义,nil 是 Go 编程语言中的零值,是众所周知且重要的预定义标识符。
Golang 中的 Lambda 表达式
发布时间:2023/04/27 浏览次数:691 分类:Go
-
本篇文章介绍如何在 Golang 中创建 lambda 表达式。Lambda 表达式似乎不存在于 Golang 中。 函数文字、lambda 函数或闭包是匿名函数的另一个名称。
在 Go 中使用断言
发布时间:2023/04/27 浏览次数:585 分类:Go
-
本篇文章介绍了 assert 在 GoLang 中的使用。在 Go 语言中使用断言:GoLang 不提供对断言的任何内置支持,但我们可以使用来自 Testify API 的广泛使用的第三方包断言。
Go 中的随机数生成
发布时间:2023/04/27 浏览次数:206 分类:Go
-
本篇文章介绍如何在 Go 语言中使用随机数生成功能。Go 中的随机数生成 Go 语言为随机数生成功能提供内置支持。 内置包 math 有方法 rand(),用于随机数生成。
在 Go 中使用 Electron API 创建 GUI
发布时间:2023/04/27 浏览次数:391 分类:Go
-
本篇文章介绍如何在 Go 语言中使用 Electron API 创建 GUI。Electron API 或 Astilectron 用于为 GoLang 创建 GUI。
在 GoLang 中安装包
发布时间:2023/04/27 浏览次数:141 分类:Go
-
使用 Go 语言的 get 命令安装所需的包非常容易。 Go 语言提供了多种命令来执行某些任务,get 就是其中之一。

