使用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
网友评论