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

简介: GO语言学习笔记(三) - 递归查找目录及子目录下的文件 递归查找目录及子目录下的文件递归查找文件夹及子文件夹下的文件 代码 package main import ( "fmt" "io/ioutil" "os" "strings" ) // 查找目录及子目录.

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")
}
目录
相关文章
|
16天前
|
Go
go语言中的数据类型
go语言中的数据类型
13 0
|
22天前
|
Go 开发者
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
掌握Go语言:Go语言结构体,精准封装数据,高效管理实体对象(22)
|
22天前
|
安全 Go
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
|
22天前
|
存储 缓存 安全
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
掌握Go语言:Go语言中的字典魔法,高效数据检索与应用实例解析(18)
|
3天前
|
数据采集 存储 Go
使用Go语言和chromedp库下载Instagram图片:简易指南
Go语言爬虫示例使用chromedp库下载Instagram图片,关键步骤包括设置代理IP、创建带代理的浏览器上下文及执行任务,如导航至用户页面、截图并存储图片。代码中新增`analyzeAndStoreImage`函数对图片进行分析和分类后存储。注意Instagram的反爬策略可能需要代码适时调整。
使用Go语言和chromedp库下载Instagram图片:简易指南
|
22天前
|
存储 安全 Go
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
|
1天前
|
Go
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
【4月更文挑战第21天】Go语言函数是代码组织的基本单元,用于封装可重用逻辑。本文介绍了函数定义(包括基本形式、命名、参数列表和多返回值)、调用以及匿名函数与闭包。在函数定义时,注意参数命名和注释,避免参数顺序混淆。在调用时,要检查并处理多返回值中的错误。理解闭包原理,小心处理外部变量引用,以提升代码质量和可维护性。通过实践和示例,能更好地掌握Go语言函数。
9 1
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
|
2天前
|
程序员 Go API
【Go语言快速上手(二)】 分支与循环&函数讲解
【Go语言快速上手(二)】 分支与循环&函数讲解
|
2天前
|
Go
Golang深入浅出之-Go语言基础语法:变量声明与赋值
【4月更文挑战第20天】本文介绍了Go语言中变量声明与赋值的基础知识,包括使用`var`关键字和简短声明`:=`的方式,以及多变量声明与赋值。强调了变量作用域、遮蔽、初始化与零值的重要性,并提醒读者注意类型推断时的一致性。了解这些概念有助于避免常见错误,提高编程技能和面试表现。
16 0
|
2天前
|
编译器 Go 开发者
Go语言入门|包、关键字和标识符
Go语言入门|包、关键字和标识符
20 0