diff --git a/utils/ext.go b/utils/ext.go index 72298cf..95e27b0 100644 --- a/utils/ext.go +++ b/utils/ext.go @@ -1,6 +1,10 @@ package utils import ( + "bytes" + "encoding/json" + "fmt" + "os" "strconv" "strings" ) @@ -12,7 +16,7 @@ func If(condition bool, trueValue, falseValue interface{}) interface{} { return falseValue } -//如果首字母是小写字母, 则变换为大写字母 +// 如果首字母是小写字母, 则变换为大写字母 func FirstToUpper(str string) string { if str == "" { return "" @@ -33,3 +37,11 @@ func ParseParams(in map[string]string) map[string]interface{} { } return out } + +func PrintJson(v any) { + jsonBy, _ := json.Marshal(v) + var out bytes.Buffer + json.Indent(&out, jsonBy, "", "\t") + out.WriteTo(os.Stdout) + fmt.Printf("\n") +} diff --git a/utils/file.go b/utils/file.go index c1df707..bcc47a8 100644 --- a/utils/file.go +++ b/utils/file.go @@ -2,6 +2,7 @@ package utils import ( "errors" + "fmt" "io" "os" "path/filepath" @@ -21,11 +22,37 @@ func StringToFile(path, content string) error { return nil } +// 文件复制 +func CopyFile(src, dst string) (int64, error) { + sourceFileStat, err := os.Stat(src) + if err != nil { + return 0, err + } + if !sourceFileStat.Mode().IsRegular() { + return 0, fmt.Errorf("%s is not a regular file", src) + } + + source, err := os.Open(src) + if err != nil { + return 0, err + } + defer source.Close() + + destination, err := os.Create(dst) + if err != nil { + return 0, err + } + defer destination.Close() + + nBytes, err := io.Copy(destination, source) + return nBytes, err +} + // 递归遍历文件夹 // rootDir: 文件夹根目录 // s: 存储文件名的切片 // filter: 过滤条件:".git", ".idea", ".vscode", ".gitignore", ".gitea", ".github", ".golangci.yml", "*.pyc" -func FileTree(rootDir string, s []string, filter []string) ([]string, error) { +func FileTreeByFilter(rootDir string, s []string, filter []string) ([]string, error) { rd, err := os.ReadDir(rootDir) if err != nil { return s, err @@ -50,7 +77,48 @@ func FileTree(rootDir string, s []string, filter []string) ([]string, error) { if fi.IsDir() { fullDir := rootDir + "/" + fi.Name() - s, err = FileTree(fullDir, s, filter) + s, err = FileTreeByFilter(fullDir, s, filter) + if err != nil { + return s, err + } + } else { + fullName := rootDir + "/" + fi.Name() + s = append(s, fullName) + } + } + return s, nil +} + +// 递归遍历文件夹 +// rootDir: 文件夹根目录 +// s: 存储文件名的切片 +// allow: 允许条件:".zip", ".check" +func FileTreeBySelect(rootDir string, s []string, allow []string) ([]string, error) { + rd, err := os.ReadDir(rootDir) + if err != nil { + return s, err + } + for _, fi := range rd { + // 检查文件名是否匹配任何一个过滤模式 + matched := false + for _, item := range allow { + exists, err := filepath.Match(item, fi.Name()) + if err != nil { + continue + } + if exists { + matched = true + break + } + } + + if !matched { + continue + } + + if fi.IsDir() { + fullDir := rootDir + "/" + fi.Name() + s, err = FileTreeBySelect(fullDir, s, allow) if err != nil { return s, err }