golang遍历返回全部目录不返回具体的文件名

简介: 使用参考:d := dir.NewDir("/")dirs, err := d.LoopLevelDir(0)// 实现遍历目录的功能// 也可以指定层级遍历,遍历几层目录package dirimport ("fmt""io/ioutil""strings""time")t...

使用参考:

d := dir.NewDir("/")
dirs, err := d.LoopLevelDir(0)

// 实现遍历目录的功能
// 也可以指定层级遍历,遍历几层目录
package dir

import (

"fmt"
"io/ioutil"
"strings"
"time"

)

type Dir struct {

rootDir   string   // 需要遍历的根目录
curDirs   []string // 当前级别的目录
dirs      []string // 全部的目录
nDirLevel int      // 当前目录级别
bInit     bool     // 是否初始化

}

// 创建一个目录
func NewDir(rootDir string) *Dir {

var dir Dir
dir.rootDir = rootDir
dir.bInit = true
dir.nDirLevel = 0
dir.curDirs = []string{rootDir}
return &dir

}

// 只遍历单层目录
func (d *Dir) loopOneDir(dirPath string) ([]string, error) {

var ds []string
// 如果是读取目录失败的,就是没有权限,直接返回空就好了
dir, err := ioutil.ReadDir(dirPath)
if err != nil {
    return nil, nil
    //return nil, fmt.Errorf("ioutil.ReadDir(%s)错误,%s", dirPath, err.Error())
}

for _, fi := range dir {
    if fi.IsDir() {
        onePath := strings.Replace(dirPath+"/"+fi.Name(), "//", "/", -1)
        ds = append(ds, onePath)
    }
}

return ds, nil

}

// 遍历目录,如果nLevel为0表示一直遍历下去直到为空截止
func (d *Dir) LoopLevelDir(nLevel int) ([]string, error) {

if !d.bInit {
    return nil, fmt.Errorf("未初始化")
}

var err error
for {
    d.nDirLevel++
    var tmpAllDirs, tmpOneDirs []string
    for i := 0; i < len(d.curDirs); i++ {
        if tmpOneDirs, err = d.loopOneDir(d.curDirs[i]); err != nil {
            return nil, fmt.Errorf("遍历根目录[%s]失败,%s", d.rootDir, err.Error())
        }
        tmpAllDirs = append(tmpAllDirs, tmpOneDirs...)
    }
    d.curDirs = tmpAllDirs
    if len(tmpAllDirs) == 0 {
        break
    }
    fmt.Printf("[%s] 第[%d]层目录遍历完成,共计[%d]文件夹\n", FormatTime(), d.nDirLevel, len(tmpAllDirs))
    d.dirs = append(d.dirs, tmpAllDirs...)
    if d.nDirLevel >= nLevel && nLevel != 0 {
        break
    }
}
return d.dirs, nil

}

// 获得当前格式化的数据,形如2017-03-15 16:07:32.236
func FormatTime() string {

return fmt.Sprintf("%04d-%02d-%02d %02d:%02d:%02d.%03d", time.Now().Year(),
    time.Now().Month(), time.Now().Day(), time.Now().Hour(), time.Now().Minute(),
    time.Now().Second(), time.Now().Nanosecond()/1e6)

}

目录
相关文章
|
10月前
|
Unix Go
Golang 语言的标准库 os 包怎么操作目录和文件?
Golang 语言的标准库 os 包怎么操作目录和文件?
37 0
|
Go C# C语言
【GoLang 笔记】遍历 map 时的 key 随机化问题及解决方法
【GoLang 笔记】遍历 map 时的 key 随机化问题及解决方法
|
12天前
|
Go
golang对遍历目录操作的优化
【8月更文挑战第7天】在Golang中优化目录遍历能提升性能。可通过缓冲读取减少系统调用、使用协程并发处理大量文件、按需跳过不必要目录及仅获取所需文件信息等方式实现。示例代码展示了如何运用协程并行遍历子目录以加快处理速度。实际应用时需依据场景选择合适策略。
|
3月前
|
存储 编译器 Go
Golang深入浅出之-掌握Go语言Map:初始化、增删查改与遍历
【4月更文挑战第21天】Go语言中的`map`提供快速的键值对操作,包括初始化、增删查改和遍历。初始化时,推荐使用`make()`函数,如`make(map[string]int)`。插入和查询键值对直接通过索引访问,更新则重新赋值。删除键值对需用`delete()`函数,确保键存在。遍历map常用`for range`,注意避免在遍历中修改map。了解这些并避免易错点,能提升代码效率和可读性。
44 1
Golang深入浅出之-掌握Go语言Map:初始化、增删查改与遍历
|
3月前
|
Go
golang力扣leetcode 105.从前序与中序遍历序列构造二叉树
golang力扣leetcode 105.从前序与中序遍历序列构造二叉树
46 0
|
3月前
|
Go API 开发者
Golang深入浅出之-文件与目录操作:os与path/filepath包
【4月更文挑战第26天】Go语言标准库`os`和`path/filepath`提供文件读写、目录操作等功能。本文涵盖`os.Open`, `os.Create`, `os.Mkdir`, `filepath.Join`等API的使用,强调了文件关闭、路径处理、并发写入和权限问题的处理,并给出实战代码示例,帮助开发者高效、安全地操作文件与目录。注意使用`defer`关闭文件,`filepath`处理路径分隔符,以及通过同步机制解决并发写入冲突。
65 2
|
3月前
|
Go 容器 SQL
【Golang Leetcode】总目录(Day1~100)
【Golang Leetcode】总目录(Day1~100)
482 1
【Golang Leetcode】总目录(Day1~100)
|
3月前
|
Go
golang力扣leetcode 94.二叉树的中序遍历
golang力扣leetcode 94.二叉树的中序遍历
32 0
golang中for循环的遍历特点、数据类型和string转换
golang中for循环的遍历特点、数据类型和string转换
|
存储 缓存 Go
Golang中文件目录操作的实现
Golang中文件目录操作的实现
88 0