迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Go >

如何在 Go 中列出目录中的文件

作者:迹忆客 最近更新:2023/01/17 浏览次数:

在 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

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

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(),用于随机数生成。

GoLang 电子邮件验证器

发布时间:2023/04/27 浏览次数:195 分类:Go

本篇文章介绍如何在 Go 语言中验证电子邮件。电子邮件需要特定格式; 否则,它们将无法工作。

卸载 GoLang

发布时间:2023/04/27 浏览次数:183 分类:Go

本篇文章介绍如何在不同的操作系统上卸载 GoLang。卸载 Go 语言 只需几个简单的步骤即可卸载 GoLang。 这些步骤对于不同的操作系统是不同的。

在 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 就是其中之一。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便