天天看點

golang周遊傳回全部目錄不傳回具體的檔案名

使用參考:

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)