开放的编程资料库

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

Go查找文件

Go查找文件教程展示了如何使用filepath.Walk查找文件。

filepath包实现了用于操作文件名路径的实用例程。

filepath.Walk遍历文件树,为树中的每个文件或目录(包括根目录)调用指定的函数。该函数递归遍历所有子目录。

$ go version
go version go1.18.1 linux/amd64

我们使用Go版本1.18。

去查找文本文件

在第一个示例中,我们搜索文本文件。

package main

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

func main() {

    var files []string

    root := "/home/janbodnar/Documents"

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

        if err != nil {

            fmt.Println(err)
            return nil
        }

        if !info.IsDir() && filepath.Ext(path) == ".txt" {
            files = append(files, path)
        }

        return nil
    })

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

    for _, file := range files {
        fmt.Println(file)
    }
}

在代码示例中,我们搜索扩展名为.txt的文件。

var files []string

匹配的文件存储在files切片中。

root := "/home/janbodnar/Documents"

这是我们开始搜索的根目录。

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

filepath.Walk的第一个参数是根目录。第二个参数是walk函数;filepath.Walk调用的函数来访问每个文件或目录。

if err != nil {

    fmt.Println(err)
    return nil
}

如果有错误则打印错误,但继续在别处搜索。

if !info.IsDir() && filepath.Ext(path) == ".txt" {
    files = append(files, path)
}

如果文件不是目录且扩展名为.txt,我们将文件附加到files切片。

for _, file := range files {
    fmt.Println(file)
}

最后,我们遍历files切片并将所有匹配的文件打印到控制台。

按大小查找文件

在下一个示例中,我们按大小查找文件。

package main

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

var files []string

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

    if err != nil {

        fmt.Println(err)
        return nil
    }

    file_size := info.Size()

    if !info.IsDir() && file_size > 1024*1024 {

        files = append(files, path)
    }

    return nil
}

func main() {

    root := "/home/janbodnar/Documents"

    err := filepath.Walk(root, VisitFile)

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

    for _, file := range files {
        fmt.Println(file)
    }
}

该示例列出了大小大于1MB的文件。

file_size := info.Size()

使用Size方法,我们确定文件的大小(以字节为单位)。

if !info.IsDir() && file_size > 1024*1024 {

    files = append(files, path)
}

如果文件不是目录并且其大小大于1MB,我们将文件添加到files切片。

按修改时间查找文件

在下一个示例中,我们按修改时间查找文件。

package main

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

func FindFilesAfter(dir string, t time.Time) (files []string, err error) {

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

        if err != nil {

            fmt.Println(err)
            return nil
        }

        if !info.IsDir() && filepath.Ext(path) == ".txt" && info.ModTime().After(t) {
            files = append(files, path)
        }

        return nil
    })

    return
}

func main() {

    root := "/home/janbodnar/Documents"

    t, err := time.Parse("2006-01-02T15:04:05-07:00", "2021-05-01T00:00:00+00:00")

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

    files, err := FindFilesAfter(root, t)

    if err != nil {

        log.Fatal(err)
    }

    for _, file := range files {

        fmt.Println(file)
    }
}

我们找到了2021年5月1日之后修改过的所有文本文件。

if !info.IsDir() && filepath.Ext(path) == ".txt" && info.ModTime().After(t) {
    files = append(files, path)
}

ModTime给出文件的最后修改时间。使用After函数,我们检查时间点是否在给定时间之后。

通过正则表达式模式查找文件

在下面的示例中,我们根据正则表达式搜索文件名。

package main

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

var files []string

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

    if err != nil {

        fmt.Println(err)
        return nil
    }

    if info.IsDir() || filepath.Ext(path) != ".txt" {

        return nil
    }

    reg, err2 := regexp.Compile("^[la]")

    if err2 != nil {

        return err2
    }

    if reg.MatchString(info.Name()) {

        files = append(files, path)
    }

    return nil
}

func main() {

    err := filepath.Walk("/home/janbodnar/Documents", VisitFile)

    if err != nil {

        log.Fatal(err)
    }

    for _, file := range files {

        fmt.Println(file)
    }
}

在代码示例中,我们搜索以字母l或字母a开头的文本文件。

reg, err2 := regexp.Compile("^[la]")

我们使用regexp.Compile编译一个正则表达式。

if reg.MatchString(info.Name()) {

    files = append(files, path)
}

如果正则表达式与文件名匹配,我们将文件添加到files切片。

在本教程中,我们使用filepath.Walk在Golang中搜索文件。

列出所有Go教程。

未经允许不得转载:我爱分享网 » Go查找文件

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

赞(0) 打赏