package utils import ( "errors" "fmt" "io" "os" "path/filepath" ) // 将字符串写入文件 func StringToFile(path, content string) error { startF, err := os.Create(path) if err != nil { return errors.New("os.Create create file " + path + " error:" + err.Error()) } defer startF.Close() _, err = io.WriteString(startF, content) if err != nil { return errors.New("io.WriteString to " + path + " error:" + err.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 FileTreeByFilter(rootDir string, s []string, filter []string) ([]string, error) { rd, err := os.ReadDir(rootDir) if err != nil { return s, err } for _, fi := range rd { // 检查文件名是否匹配任何一个过滤模式 matched := false for _, item := range filter { 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 = 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 } } else { fullName := rootDir + "/" + fi.Name() s = append(s, fullName) } } return s, nil }