utils/file.go (71 lines of code) (raw):

package utils import ( "fmt" "os" "path" ) func Exists(filepath string) bool { _, err := os.Stat(filepath) return !os.IsNotExist(err) } func CopyWithOptions(srcDir, dstDir, prefixForDstFile string) error { srcFiles, err := os.ReadDir(srcDir) if err != nil { return fmt.Errorf("failed to read source directory: %w", err) } if !Exists(dstDir) { err = os.MkdirAll(dstDir, 0755) if err != nil { return fmt.Errorf("failed to create destination directory: %w", err) } } for _, srcFile := range srcFiles { srcFilePath := path.Join(srcDir, srcFile.Name()) dstFilePath := path.Join(dstDir, prefixForDstFile+srcFile.Name()) if srcFile.IsDir() { if err := Copy(srcFilePath, dstFilePath); err != nil { return fmt.Errorf("failed to copy directory: %w", err) } } else { data, err := os.ReadFile(srcFilePath) if err != nil { return fmt.Errorf("failed to read source file: %w", err) } if err := os.WriteFile(dstFilePath, data, 0644); err != nil { return fmt.Errorf("failed to write destination file: %w", err) } } } return nil } func Copy(srcDir, dstDir string) error { return CopyWithOptions(srcDir, dstDir, "") } func ListFiles(input string, extension string, depth int) ([]string, error) { f, err := os.Stat(input) if err != nil { return nil, err } if !f.IsDir() { if path.Ext(input) == extension { return []string{input}, nil } return nil, nil } if depth == 0 { return nil, nil } files, err := os.ReadDir(input) if err != nil { return nil, err } out := make([]string, 0) for _, file := range files { list, err := ListFiles(path.Join(input, file.Name()), extension, depth-1) if err != nil { return nil, fmt.Errorf("failed to list files: %w", err) } out = append(out, list...) } return out, nil }