GO语言学习笔记(三) - 递归查找目录及子目录下的文件

news/2024/7/4 23:49:26

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")
}

http://www.niftyadmin.cn/n/2132469.html

相关文章

一种基于金鹰优化和灰狼优化的混合算法

文章目录一、理论基础1、金鹰优化算法2、灰狼优化算法3、提出的混合算法3.1 个体示例学习GEO(PELGEO)3.2 差分变异的简化GWO(DMSGWO)3.2.1 差分变异策略3.2.2 简化策略3.2.3 混合差异变异策略和简化策略3.3 自适应混合策略二、仿真实验与结果分析三、参考文献一、理论基础 1、…

算术优化与阿奎拉鹰优化的混合算法

文章目录一、理论基础1、阿奎拉鹰优化算法2、算术优化算法3、AO与AOA的混合(AOAAO)(1)改进逃逸能量参数(2)AOAAO算法伪代码二、仿真实验与结果分析三、参考文献一、理论基础 1、阿奎拉鹰优化算法 请参考这里。 2、算术优化算法…

酒瓶换酒

""" 一开始有5瓶啤酒 两个空酒瓶换一瓶啤酒 四个瓶盖换一瓶啤酒 问你最后能够喝到多少瓶啤酒 """def get(n):bottle, head n, ndrink 0while 1:drink bottleuse bottle // 2 head // 4if use 0:breakbottle % 2head % 4bottle usehead u…

基于随机无迹σ变异的改进HHO算法

文章目录一、理论基础1、哈里斯鹰优化算法HHO2、改进哈里斯鹰优化算法OSHHO(1)伪对立和伪反射学习机制(2)随机无迹点变异机制(3)能量因子非线性调整机制(4)OSHHO算法执行流程二、仿真…

基于亨利气体溶解度优化算法的函数寻优算法

文章目录一、理论基础1、亨利气体溶解度优化算法(1)步骤1:初始化过程(2)步骤2:分簇(3)步骤3:评价(4)步骤4:更新亨利系数(5…

JavaScript继承总结

1.创建对象 1.字面量对象2.构造函数3.Object.create //1.字面量 var obj{name: 字面量,show: function(){console.log(this.name)} } //2.构造函数 function fun (name) {this.namename } var objnew fun(obj) //3.Object.create var obj{name: obj} var objObject.create(obj)…

融合边界处理机制的学习型麻雀搜索算法

文章目录一、理论基础1、麻雀搜索算法2、HSSA搜索算法2.1 Piecewise map初始化种群2.2 自适应警戒者策略2.3 多策略学习机制2.3.1 排序配对学习策略2.3.2 竞争学习策略2.4 多策略边界处理2.5 HSSA算法流程二、仿真实验和结果分析三、参考文献一、理论基础 1、麻雀搜索算法 请…

策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的: if(type apple){//deal with apple } else if (type b…