Dir Walk

概述 #

调用 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
*/

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,商业转载请联系作者获得授权。

© 蛮荆 | 陕公网安备 61011302001681 号 | 陕ICP备2023004378号-1 | Rendered by Hugo