Go 操作文件 遍历目录获取文件列表

通过go遍历目录获取文件列表

本文将会列举三种方法

by Using:

filepath.Walk
ioutil.ReadDir
os.File.Readdir

 

使用filepath.Walk

path/filepath 标准库的包提供了便捷的Walk方法,它能自动的扫描子目录,使用起来也很简单

复制代码
package main

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

func main() {
    var files []string

    root := "/some/folder/to/scan"
    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        files = append(files, path)
        return nil
    })
    if err != nil {
        panic(err)
    }
    for _, file := range files {
        fmt.Println(file)
    }
}
复制代码

 

 

使用ioutil.ReadDir

filepath.Walk是很方便但是它会扫描所有子文件夹,缺省情况下,但这有时候不是我们想要的需求

go的标准库还提供了ioutil.ReadDir

ioutil.ReadDir需要一个string类型的文件夹路径然后返回一个os.FileInfo的切片,在上文中提到过。


复制代码
package main

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

func main() {
    files, err := ioutil.ReadDir(".")
    if err != nil {
        log.Fatal(err)
    }

    for _, file := range files {
        fmt.Println(file.Name())
    }
}
复制代码

 

使用os.File.Readdir

ReadDir内部的实现方式

复制代码
// ReadDir reads the directory named by dirname and returns
// a list of directory entries sorted by filename.
func ReadDir(dirname string) ([]os.FileInfo, error) {
    f, err := os.Open(dirname)
    if err != nil {
        return nil, err
    }
    list, err := f.Readdir(-1)
    f.Close()
    if err != nil {
        return nil, err
    }
    sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() })
    return list, nil
}
复制代码

 

 

我们可以看到它只扫描文件夹目录,然后将文件通过名字排序。如果我们不需要这种排序我们可以这样:

复制代码
package main

import (
    "fmt"
    "log"
    "os"
)

func main() {
    dirname := "."

    f, err := os.Open(dirname)
    if err != nil {
        log.Fatal(err)
    }
    files, err := f.Readdir(-1)
    f.Close()
    if err != nil {
        log.Fatal(err)
    }

    for _, file := range files {
        fmt.Println(file.Name())
    }
}
复制代码

 

Go获取当前项目绝对路径

复制代码
package main

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

func main() {
    //获取当前项目绝对路径
    path, err2 := os.Executable()
    if err2 != nil {
        fmt.Println(err2)
    }
    dir := filepath.Dir(path)
    fmt.Println("111", path) // /Users/mac/repose/idphoto_server_lite/test/test3
    fmt.Println("2222", dir) // /Users/mac/repose/idphoto_server_lite/test
}
复制代码

 

 

 

 

 

 

 
 

 

posted on   星河赵  阅读(4213)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2018-03-18 axel命令 文件下载
2018-03-18 python 列表的内容赋值
2018-03-18 Python的sys.argv使用说明 通过终端写入环境变量
2018-03-18 python map函数的使用
2018-03-18 python 将txt内容写入excel

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示