ZetCode

Go 列出目录

最后修改时间 2024 年 4 月 11 日

Go 列出目录展示了如何在 Golang 中列出目录内容。

目录定义

目录是计算机文件系统中用于存储和定位文件的单元。目录以树状结构进行分层组织。目录具有父子关系。目录有时也称为文件夹。

在 Go 中,我们可以使用 `ioutil.ReadDir`、`filepath.Walk` 或 `filepath.Glob` 来列出目录。

使用 ioutil.ReadDir 列出 Go 目录

`ioutil.ReadDir` 读取目录并返回按文件名排序的目录条目列表。

func ReadDir(dirname string) ([]os.FileInfo, error)

这是 `ReadDir` 函数的语法。

read_homedir.go
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"
)

func main() {

    home, err := os.UserHomeDir()

    if err != nil {

        log.Fatal(err)
    }

    files, err := ioutil.ReadDir(home)

    if err != nil {

        log.Fatal(err)
    }

    for _, f := range files {

        fmt.Println(f.Name())
    }
}

该示例读取用户主目录的内容。主用户目录通过 `os.UserHomeDir` 确定。列表是非递归的。

按扩展名列出 Go 文件

`filepath.Ext` 返回路径使用的文件名扩展名。

list_files_ext.go
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "path/filepath"
)

func main() {

    path := "/home/janbodnar/Documents/"

    files, err := ioutil.ReadDir(path)

    if err != nil {

        log.Fatal(err)
    }

    for _, f := range files {

        if filepath.Ext(f.Name()) == ".txt" {

            fmt.Println(f.Name())
        }
    }
}

该示例显示了 `Documents` 目录中的所有 `.txt` 文件。

列出 Go 目录

可以使用 `FileInfo` 的 `IsDir` 将列表限制为仅文件或目录。

list_files.go
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"
)

func main() {

    home, err := os.UserHomeDir()

    if err != nil {

        log.Fatal(err)
    }

    files, err := ioutil.ReadDir(home)

    if err != nil {

        log.Fatal(err)
    }

    for _, f := range files {

        if !f.IsDir() {
            fmt.Println(f.Name())
        }
    }
}

该示例仅列出主目录中的文件。

使用 filepath.Glob 列出 Go 目录

filepath.Glob 返回所有匹配模式的文件名,如果没有匹配的文件则返回 nil

func Glob(pattern string) (matches []string, err error)

这是 filepath.Glob 函数的语法。

globbing.go
package main

import (
    "fmt"
    "log"
    "path/filepath"
)

func main() {

    files, err := filepath.Glob("/root/Documents/prog/golang/**/*.go")

    if err != nil {
        log.Fatal(err)
    }

    for _, file := range files {

        fmt.Println(file)
    }
}

示例列出给定目录中的所有 Go 文件。使用 ** 模式,列出是递归的。

使用 filepath.Walk 列出 Go 目录

对于递归目录列表,我们可以使用 `filepath.Walk` 函数。

func Walk(root string, walkFn WalkFunc) error

该函数遍历以 root 为根的文件树,为树中的每个文件或目录调用 `walkFn`,包括 root。访问文件和目录的所有错误都由 `walkFn` 进行过滤。

walking.go
package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
)

func main() {

    err := filepath.Walk("/home/janbodnar/Documents/prog/golang/",

        func(path string, info os.FileInfo, err error) error {

            if err != nil {
                return err
            }

            fmt.Println(path, info.Size())
            return err
        })

    if err != nil {

        log.Println(err)
    }
}

该示例递归地遍历给定目录。它输出每个路径名和大小。

Go 目录大小

以下示例使用 `filepath.Walk` 函数来获取给定目录中所有文件的大小。不包括目录大小。

dirsize.go
package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
)

func main() {

    var size int64

    path := "/home/janbodnar/Documents/prog/golang/"

    err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {

        if err != nil {
            return err
        }

        if !info.IsDir() {

            size += info.Size()
        }

        return err
    })

    if err != nil {

        log.Println(err)
    }

    fmt.Printf("The directory size is: %d\n", size)
}

该示例使用 `IsDir` 函数来区分文件和目录。文件大小通过 `Size` 函数确定。

列出 Go 大文件

以下示例使用 `filepath.Walk` 输出大文件。

large_files.go
package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"
)

func main() {

    var files []string

    var limit int64 = 1024 * 1024 * 1024

    path := "/home/janbodnar/Downloads/"

    err := filepath.Walk(path, func(path string, info os.FileInfo, err error) error {

        if err != nil {
            return err
        }

        if info.Size() > limit {

            files = append(files, path)
        }

        return err
    })

    if err != nil {
        log.Println(err)
    }

    for _, file := range files {

        fmt.Println(file)
    }
}

在代码示例中,我们列出了 `Downloads` 目录中大于 1GB 的所有文件。

来源

Go path/filepath 包 - 参考

在本文中,我们列出了 Go 中的目录内容。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Go 教程