GO語言按照深度遍歷文件
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