如何使用Golang遍历目录并读取文件列表

来源:我的博客作者:上海网站建设头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何使用Golang遍历目录并读取文件列表》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何使用Golang遍历目录并读取文件列表》有用,将其分享出去将是对创作者最好的鼓励。

在Golang中处理目录扫描和文件列表读取的需求时,ioutil包提供的ReadDir方法是一个常用的选择,它能够快速获取指定目录下的所有文件信息,简化目录遍历的实现流程。

如何使用Golang遍历目录并读取文件列表

ioutil ReadDir方法基本介绍

ioutil.ReadDir是Go标准库ioutil包中的一个函数,其作用是读取指定目录的所有目录项,返回一个按文件名排序的[]os.FileInfo切片,同时返回可能出现的错误。该方法的函数签名如下:

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

其中dirname参数表示需要扫描的目标目录路径,可以是相对路径也可以是绝对路径。返回的切片中每个元素都包含了对应文件或子目录的详细信息,比如文件名、大小、修改时间、是否为目录等属性。

基础使用示例

下面是一个最简单的使用ReadDir读取目录文件列表的示例,实现读取指定目录下的所有文件并打印文件名:

package main

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

func main() {
    // 指定要扫描的目录路径,这里使用当前目录
    dirPath := "./"
    // 调用ReadDir方法获取目录下的文件信息
    fileInfos, err := ioutil.ReadDir(dirPath)
    if err != nil {
        log.Fatalf("读取目录失败:%v", err)
    }
    // 遍历文件信息切片,打印每个文件的名称
    fmt.Printf("目录 %s 下的文件列表:n", dirPath)
    for _, fileInfo := range fileInfos {
        fmt.Println(fileInfo.Name())
    }
}

运行上述代码后,会输出当前目录下所有文件和子目录的名称,默认按照文件名的字典序排列。

获取更详细的文件信息

os.FileInfo接口提供了多个方法可以获取文件的详细属性,常用的属性获取方法如下:

  • Name():返回文件的名称,不包含路径部分
  • Size():返回文件的大小,单位是字节,如果是目录则返回0
  • Mode():返回文件的权限模式和类型信息
  • ModTime():返回文件的最后修改时间
  • IsDir():判断当前项是否为目录,返回布尔值

下面的示例会打印每个文件或目录的详细属性:

package main

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

func main() {
    dirPath := "./"
    fileInfos, err := ioutil.ReadDir(dirPath)
    if err != nil {
        log.Fatalf("读取目录失败:%v", err)
    }
    fmt.Printf("%-20s %-10s %-20s %-10sn", "文件名", "大小(字节)", "修改时间", "是否为目录")
    for _, fileInfo := range fileInfos {
        // 格式化输出文件信息
        fmt.Printf("%-20s %-10d %-20v %-10vn",
            fileInfo.Name(),
            fileInfo.Size(),
            fileInfo.ModTime().Format("2006-01-02 15:04:05"),
            fileInfo.IsDir(),
        )
    }
}

递归遍历子目录

ioutil.ReadDir本身只读取指定目录的直接子项,不会递归遍历子目录下的内容。如果需要获取目录下所有层级的文件,需要结合递归逻辑实现。下面的示例实现了递归遍历目录并打印所有文件的路径:

package main

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

// 递归遍历目录的辅助函数
func walkDir(dirPath string) error {
    // 读取当前目录的文件列表
    fileInfos, err := ioutil.ReadDir(dirPath)
    if err != nil {
        return err
    }
    for _, fileInfo := range fileInfos {
        // 拼接完整的文件路径
        fullPath := filepath.Join(dirPath, fileInfo.Name())
        fmt.Println(fullPath)
        // 如果是目录,递归遍历
        if fileInfo.IsDir() {
            if err := walkDir(fullPath); err != nil {
                return err
            }
        }
    }
    return nil
}

func main() {
    targetDir := "./"
    err := walkDir(targetDir)
    if err != nil {
        log.Fatalf("递归遍历目录失败:%v", err)
    }
}

注意事项

在使用ioutil.ReadDir时需要注意以下几点:

  • 路径参数需要保证正确,如果目录不存在或者没有读取权限,会返回对应的错误,必须进行错误处理
  • ioutil包在Go 1.16版本之后已经被逐步废弃,官方推荐使用os.ReadDir方法替代,os.ReadDir的返回值是[]os.DirEntry,性能更优且功能更完善
  • 如果需要过滤特定类型的文件,可以在遍历切片时添加判断逻辑,比如只处理后缀为.txt的文件

如果需要兼容旧版本Go代码,ioutil.ReadDir仍然可以正常使用,新开发的代码建议优先选择os.ReadDir实现目录扫描功能。

GolangReadDirioutil目录遍历文件列表修改时间:2026-07-02 06:03:27

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。