golang 获取指定目录下的子文件列表

GO语言按照深度遍历文件

原创 2016年07月20日 09:45:19

 

 

go语言提供了大量的包,基于这些包我们可以完成很多有意思的事情,本节我们就来看看如何利用go语言来遍历文件。

常规方法(不使用path/filepath包)

比较直观的方式是,按照某个目录递归的方式便利文件:

func walkDir(dirpath string, depth int){
    if depth > DEPTH{//大于设定的深度
        return
    }
    files, err := ioutil.ReadDir(dirpath)//读取目录下文件
    if err != nil{
        return
    }
    for _, file := range files{
        if file.IsDir(){
            walkDir(dirpath + "/" + file.Name(), depth+1)
            continue
        }else{
                .....
        }
    }
}
  • 先利用ioutil包中的ReadDir方法读取该目录下Dir信息
  • 根据返回的file信息判断其是否为目录 
    • 如果是目录则递归调用walkDir方法
    • 否则对文件进行处理

这就完成了对文件的一个遍历,这样的遍历操作简单。当然由于递归调用,因此比较消耗内存。

go的filepath包

filepath包实现了兼容各个操作系统的文件路径实用操作方法

本次用到的主要是两个方法

方法定义
WalkFunc type WalkFunc func(path string, info os.FileInfo, err error) erro
Walk func Walk(root string, walkFc WalkFunc) error

我们可以看到其实在Walk里面有一个WalkFunc方法的调用,其作用是用来过滤。

Walk(root stirng, walkFn WalkFunc) error方法

walk方法会遍历root下的所有文件(包含root)并对每一个目录和文件都调用walkFunc方法。在访问文件和目录时发生的错误都会通过error参数传递给WalkFunc方法。文件是按照词法顺序进行遍历的,这个通常让输出更漂亮,但是也会导致处理非常大的目录时效率会降低。另外,walk函数不会遍历符号链接。
  • 1
  • 2

WalkFunc(path string, info os.FileInfo, err error) error函数

Walk函数在遍历文件时调用。调用时将参数传递给path,这是一个绝对路径,也就是Walk函数中的root作为前缀。将root + 文件名作为path传递给WalkFunc函数。例如在"Dir"目录下遍历到"a"文件,则path="Dir/a"

Info是path所指向文件的文件信息。如果在遍历过程中出现了问题,传入参数err会描述这个问题。WalkFunc函数可以处理这个问题,Walk将不会再深入该目录。如果函数会返回一个错误,Walk函数会终止执行;只有一个例外,我们也通常用这个来跳过某些目录。当WalkFunc的返回值是filepaht.SkipDir时,Walk将会跳过这个目录,照常执行下一个文件。
  • 1
  • 2
  • 3
  • 4

例子:

import "path/filepath"
func walkDir(dir string){
    files, err := ioutil.ReadDir(dir)
    if err != nil{
        ...
    }
    for _, file := range files{
        filename := file.Name()
        filepath.Walk(filename,func(path string, fi os.FileInfo, err error)error{
            depth := strings.Count(path,"/") - strings.Count(filename,"/")
            if depth > DEPTH{
                return filepath.SkipDir
            }
            if err != nil{
                //处理文件读取异常
            }
            if fi.IsDir(){
                满足条件不用管
                不满足条件
                return filepath.SkipDir 
            }
        })
    }
}

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sylar_d/article/details/51965408
posted @ 2018-03-23 11:58  无天666  阅读(6294)  评论(0编辑  收藏  举报