为了账号安全,请及时绑定邮箱和手机立即绑定

GOLANG - 查找在日期范围内创建的文件

GOLANG - 查找在日期范围内创建的文件

Go
慕田峪7331174 2023-03-21 10:22:48
我想知道如何在日期范围内的特定文件夹中查找文件。例如:我想在文件夹 X 中查找在 01-Aug-13 和 31-Aug-13 之间创建的所有文件。我试过这个:dir := "path/to/dir"t, err := time.Parse("2006-01-02T15:04:05-07:00", "2018-04-07T05:48:03+08:00")if err != nil {    panic(err)}paths, infos, err := FindFilesAfter(dir, t)if err != nil {    panic(err)}for i, _ := range paths {    checkFile(paths[i], infos[i])}func FindFilesAfter(dir string, t time.Time) (paths []string, infos []os.FileInfo, err error) {    err = filepath.Walk(dir, func(p string, i os.FileInfo, e error) error {        if e != nil {            return e        }        if !i.IsDir() && i.ModTime().After(t) {            paths = append(paths, p)            infos = append(infos, i)        }        return nil    })    return}
查看完整描述

1 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

希望以下答案是您要找的。

  • 如果您的问题更多是关于时间范围,您可以使用 functionBeforeAfterfrom timepackage

  • 如果您的问题更多是关于查找创建时间而不是修改时间。您可以考虑使用 package syscall 来查找 atime、mtime 和 ctime——本质上它们是:

atime (access time) 是文件访问时间

mtime(modify time)是文件修改时间

ctime(change time)是inode或者文件的改变时间

package main


import (

    "io/fs"

    "log"

    "os"

    "syscall"

    "time"

)


func main() {

    // prepare data

    start, _ := time.Parse(time.RFC3339, "2022-11-26T07:04:05Z")

    end, _ := time.Parse(time.RFC3339, "2022-11-26T08:10:00Z")

    var dir = "your path"


    files := FindFilesByDateRange(dir, start, end)


    // print result

    log.Printf("file range: %s-%s\n", start.Format(time.RFC3339), end.Format(time.RFC3339))

    for _, f := range files {

        log.Println(f.Name())

    }


}


func FindFilesByDateRange(dir string, start, end time.Time) []fs.FileInfo {

    fileSystem := os.DirFS(dir)

    var files []fs.FileInfo

    if err := fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {

        if err != nil {

            log.Fatal(err)

        }

        fileInfo, err := d.Info()

        if err != nil {

            return err

        }

        stat := fileInfo.Sys().(*syscall.Stat_t)

        cDate := time.Unix(stat.Ctimespec.Sec, stat.Ctimespec.Nsec).UTC()

        if !d.IsDir() && (cDate.After(start) && cDate.Before(end)) {

            files = append(files, fileInfo)

        }

        return nil

    }); err != nil {

        return nil

    }

    return files

}


查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信