天天看點

GO語言學習筆記(三) - 遞歸查找目錄及子目錄下的檔案GO語言學習筆記(三) - 遞歸查找目錄及子目錄下的檔案

GO語言學習筆記(三) - 遞歸查找目錄及子目錄下的檔案

遞歸查找目錄及子目錄下的檔案

遞歸查找檔案夾及子檔案夾下的檔案

代碼

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "strings"
)

// 查找目錄及子目錄下的檔案
// 添加參數判斷
// path : 目标目錄
// files : 容納所有檔案路徑的結果數組
// targetType : 目标檔案類型
// ignoreFile : 忽略檔案(檔案名,包括擴充名)
// ignorePath : 忽略目錄
// ignoreType : 忽略檔案類型
func GetAllFile(path string, files *[]string, targetType *[]string, ignoreFile *[]string, ignorePath *[]string, ignoreType *[]string) (err error)  {

    if !isAllEmpty(targetType) && !isAllEmpty(ignoreType) {

        fmt.Printf("WARNGING: 目标檔案類型已指定, 忽略檔案類型無須指定。後續進行中忽略檔案類型作為空處理\n")
    }

    err = getAllFileRecursion(path, files, targetType, ignoreFile, ignorePath, ignoreType)
    return err;
}

// 遞歸查找目錄及子目錄下的檔案
// path : 目标目錄
// files : 容納所有檔案路徑的結果數組
// targetType : 目标檔案類型
// ignoreFile : 忽略檔案(檔案名,包括擴充名)
// ignorePath : 忽略目錄
// ignoreType : 忽略檔案類型
func getAllFileRecursion(path string, files *[]string, targetType *[]string, ignoreFile *[]string, ignorePath *[]string, ignoreType *[]string) (err error)  {
    l, err := ioutil.ReadDir(path)
    if err != nil {
        return err
    }

    separator := string(os.PathSeparator)
    for _, f := range l {
        tmp := string(path + separator + f.Name())

        if f.IsDir() {

            // 過濾被忽略的檔案夾(檔案夾名完全相同)
            if !isInArray(ignorePath, f.Name()) {

                err = getAllFileRecursion(tmp, files, targetType, ignoreFile, ignorePath, ignoreType)
                if err != nil {
                    return err
                }
            }
        } else {
            // 目标檔案類型被指定
            if !isAllEmpty(targetType) {

                // 屬于目标檔案類型
                if isInSuffix(targetType, f.Name()) {

                    // 忽略檔案為空 或者 目标檔案中不含有指定忽略檔案
                    if isAllEmpty(ignoreFile) || !isInArray(ignoreFile, f.Name()) {
                        
                        *files = append(*files, tmp)
                    }
                }
            } else { // 目标檔案類型為空

                // 忽略檔案類型被指定
                if !isAllEmpty(ignoreType) {

                    // 不屬于忽略檔案類型
                    if !isInSuffix(ignoreType, f.Name()) {
                        
                        // 忽略檔案為空 或者 目标檔案中不含有指定忽略檔案
                        if isAllEmpty(ignoreFile) || !isInArray(ignoreFile, f.Name()) {
                            
                            *files = append(*files, tmp)
                        }
                    }
                } else { // 忽略檔案類型為空

                    // 忽略檔案為空 或者 目标檔案中不含有指定忽略檔案
                    if isAllEmpty(ignoreFile) || !isInArray(ignoreFile, f.Name()) {
                        
                        *files = append(*files, tmp)
                    }
                }
            }
        }
    }

    return nil
}

// 判斷目标字元串是否是在數組中
func isInArray(list *[]string, s string) (isIn bool) {

    if len(*list) == 0 {
        return false
    }

    isIn = false
    for _, f := range *list {  
        
        if f == s {
            isIn = true
            break
        }
    }
    
    return isIn
}

// 判斷目标字元串的末尾是否含有數組中指定的字元串
func isInSuffix(list *[]string, s string) (isIn bool) {

    isIn = false
    for _, f := range *list {  
        
        if strings.TrimSpace(f) != "" && strings.HasSuffix(s, f) {
            isIn = true
            break
        }
    }
    
    return isIn
}

// 判斷數組各元素是否是空字元串或空格
func isAllEmpty(list *[]string) (isEmpty bool) {

    if len(*list) == 0 {
        return true
    }

    isEmpty = true
    for _, f := range *list {  
        
        if strings.TrimSpace(f) != "" {
            isEmpty = false
            break
        }
    }
    
    return isEmpty
}

func main() {
    fmt.Printf("Info: Start\n")

    targetType := []string{".js", "", ""}
    ignoreFile := []string{"index.js"}
    ignorePath := []string{".git"}
    ignoreType := []string{".gitignore", ".exe"}

    var files []string
    var path = "C:\\Users\\Administrator\\go\\src\\github.com\\bettersun\\hellogo"
    err := GetAllFile(path, &files, &targetType, &ignoreFile, &ignorePath, &ignoreType)
    if err != nil {
        fmt.Printf(err.Error() + "\n")
    }
    
    fmt.Printf("檔案名(全路徑)清單:\n")
    for _, file := range files {
        fmt.Printf("  [%s]\n", file)
    }

    fmt.Printf("Info: End\n")
}           

繼續閱讀