乐趣区

关于go:Go-快速入门指南-遍历目录

概述

调用 path/filepath 包即可。filepath.Walk() 办法十分弱小,无需递归,以非常简单的形式实现了整个目录遍历。

倡议先浏览 创立, 删除目录。

例子

package main

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

func main() {
    dir := "/tmp/test_main_go_dir"
    
    // 创立一些测试目录和文件
    if _, err := os.Stat(dir); os.IsNotExist(err) {subDir := filepath.Join(dir, "1", "2", "3")
        err = os.MkdirAll(subDir, 0755) // 创立多级目录
        if err != nil {panic(err)
        }

        // 退出时删除目录
        defer func() {err = os.RemoveAll(dir)
            if err != nil {panic(err)
            }
        }()

        // 在目录上面新建 2 个文件
        _, err := os.Create(filepath.Join(subDir, "4.log"))
        if err != nil {panic(err)
        }
        _, err = os.Create(filepath.Join(subDir, "5.log"))
        if err != nil {panic(err)
        }
    }

    err := filepath.Walk(dir, func(path string, info fs.FileInfo, err error) error {
        var typ string
        if info.IsDir() {typ = "Dir"} else {typ = "File"}

        fmt.Printf("[%s] %s\n", typ, path)
        return nil
    })
    if err != nil {panic(err)
    }
}

// $ go run main.go
// 输入如下
/**
  [Dir] /tmp/test_main_go_dir
  [Dir] /tmp/test_main_go_dir/1
  [Dir] /tmp/test_main_go_dir/1/2
  [Dir] /tmp/test_main_go_dir/1/2/3
  [File] /tmp/test_main_go_dir/1/2/3/4.log
  [File] /tmp/test_main_go_dir/1/2/3/5.log
*/

分割我

退出移动版