美文网首页
go语言递归扫描指定目录下文件

go语言递归扫描指定目录下文件

作者: 东南枝下 | 来源:发表于2022-02-02 16:55 被阅读0次

使用go语言递归查找指定目录下的文件,根据正则匹配筛选出需要的文件,并且忽略指定的目录

先使用ioutil.ReadDir遍历出指定目录下的文件,再递归进目录中遍历,问题的关键在于识别出文件为目录,fs.FileInfo中有一个IsDir()函数可以识别是否是目录

正则匹配使用regexp.MatchString,regexp中有很多正则操作的工具,如根据正则替换字符串中的指定字符

message := "Xu,Yao.Jing/Xing;ChuLi'De[Zi]Fu:Chuang"
// 去除标点符号
re1 := regexp.MustCompile("[^a-zA-Z0-9\\s]")
newMessage:= re1.ReplaceAllString(message, "")

功能实现如下

package common

import (
    "errors"
    "io/ioutil"
    "log"
    "os"
    "os/exec"
    "path/filepath"
    "regexp"
    "strings"
)

type targetFiles struct {
    FilePaths  []string
    regexList  []string
    ignoreDirs []string
}

func New(rootPath string, regexList, ignoreDirs []string) *targetFiles {
    return &targetFiles{
        FilePaths:  []string{},
        regexList:  regexList,
        ignoreDirs: ignoreDirs,
    }
}

func (tf *targetFiles) FindFile(path string) error {
    fileInfos, err := ioutil.ReadDir(path)
    if err != nil {
        return err
    }
    separator := string(os.PathSeparator)
    for _, fileInfo := range fileInfos {
        // 当前文件名
        currentFileName := fileInfo.Name()
        currentFilePath := path + separator + currentFileName

        if fileInfo.IsDir() {
            // 如果是包含在忽略文件夹内
            if tf.isIgnoreDir(currentFileName) {
                continue
            }
            // 如果是文件夹,递归去处理
            err = tf.FindFile(currentFilePath)
            if err != nil {
                return err
            }
        } else {
            if tf.isMatchRegex(currentFileName) {
                tf.FilePaths = append(tf.FilePaths, currentFilePath)
            }
        }
    }

    return nil
}

func (tf *targetFiles) isIgnoreDir(dirName string) bool {
    for _, str := range tf.ignoreDirs {
        if str == dirName {
            return true
        }
    }
    return false
}

func (tf *targetFiles) isMatchRegex(str string) bool {
    for _, regex := range tf.regexList {
        isIn, err := regexp.MatchString(regex, str)
        if err != nil {
            log.Fatalf("egexp.MatchString err : %v", err)
        }
        if isIn {
            return true
        }
    }
    return false
}

// 获取当前可执行文件所在目录
func GetCurrentPath() (string, error) {
    file, err := exec.LookPath(os.Args[0])
    if err != nil {
        return "", err
    }
    path, err := filepath.Abs(file)
    if err != nil {
        return "", err
    }
    //i := strings.LastIndex(path, "/")
    //if i < 0 {
    //  i = strings.LastIndex(path, "\\")
    //}
    i := strings.LastIndex(path, string(os.PathSeparator))
    if i < 0 {
        return "", errors.New(`error: Can't find "/" or "\"`)
    }
    return path[0 : i+1], nil
}

gitee: gitee.com/jenson343/jtoolkit

相关文章

网友评论

      本文标题:go语言递归扫描指定目录下文件

      本文链接:https://www.haomeiwen.com/subject/dtdrkrtx.html