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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM