开放的编程资料库

当前位置:我爱分享网 > Go教程 > 正文

如何在Golang中列出目录内容

Golistdirectory显示如何在Golang中列出目录内容。

目录定义

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

在Go中,我们可以使用ioutil.ReadDirfilepath.Walkfilepath.Glob列出目录。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

使用ioutil.ReadDir去列出目录

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

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

这是ReadDir函数的语法。

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确定。该列表是非递归的。

按扩展名列出文件

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

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文件。

去列出目录

FileInfo'sIsDir可用于将列表限制为仅文件或目录。

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())
        }
    }
}

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

Golistdirectorywithfilepath.Glob

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

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

这是filepath.Glob函数的语法。

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去列出目录

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

func Walk(root string, walkFn WalkFunc) error

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

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函数获取给定目录中所有文件的大小。不包括目录大小。

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函数确定。

列出大文件

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

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中的目录内容。

列出所有Go教程。

未经允许不得转载:我爱分享网 » 如何在Golang中列出目录内容

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏