博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang 获取指定目录下的子文件列表
阅读量:6976 次
发布时间:2019-06-27

本文共 1878 字,大约阅读时间需要 6 分钟。

GO语言按照深度遍历文件

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

 

 

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包

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

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

方法 定义
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
你可能感兴趣的文章
vue父组件调用子组件的方法
查看>>
事件源ES的优势
查看>>
Vue从Hello World到打包(后端适读)
查看>>
基于Netty实现的轻量级分布式服务框架
查看>>
WebViewJavascriptBridge原理解析
查看>>
设备物理像素、设备独立像素
查看>>
MVC模式
查看>>
ThoughtWorks雷达上的新奇变化
查看>>
京东618:智能机器人JIMI的进击之路
查看>>
Hyperledger Grid:一个用于分布式供应链解决方案的框架
查看>>
Vue性能优化:如何实现延迟加载和代码拆分?
查看>>
ES6: 字符串
查看>>
Kafka背后公司获1.25亿融资,估值超25亿美元
查看>>
白话解析分布式系统,小白也能看懂
查看>>
如何打造一流的视觉AI技术
查看>>
Go 1.12发布:改进了运行时性能以及模块支持
查看>>
Oracle与JCP执行委员会分享了他们的Java EE策略
查看>>
QCon2016旧金山大会焦点分享者确认
查看>>
阿里云MWC 2019发布7款产品:Blink每秒可完成17亿次计算
查看>>
跨进程通信,到底用长连接还是短连接
查看>>