From dd83b872db24d5da5024800ee87428d171d15956 Mon Sep 17 00:00:00 2001 From: amorozov Date: Tue, 25 Jun 2024 18:20:46 +0300 Subject: [PATCH] feature: added file copier --- pkg/io/files/fle_copier.go | 93 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 pkg/io/files/fle_copier.go diff --git a/pkg/io/files/fle_copier.go b/pkg/io/files/fle_copier.go new file mode 100644 index 0000000..2996a63 --- /dev/null +++ b/pkg/io/files/fle_copier.go @@ -0,0 +1,93 @@ +package files + +import ( + "fmt" + "io" + "os" + "path/filepath" +) + +func CopyDir(src, dst string) error { + src = filepath.Clean(src) + dst = filepath.Clean(dst) + + si, err := os.Stat(src) + if err != nil { + return err + } + if !si.IsDir() { + return fmt.Errorf("source is not a directory") + } + + _, err = os.Stat(dst) + if err != nil && !os.IsNotExist(err) { + return err + } + if err == nil { + return fmt.Errorf("destination already exists") + } + + err = os.MkdirAll(dst, si.Mode()) + if err != nil { + return err + } + + entries, err := os.ReadDir(src) + if err != nil { + return err + } + + for _, entry := range entries { + srcPath := filepath.Join(src, entry.Name()) + dstPath := filepath.Join(dst, entry.Name()) + + if entry.IsDir() { + err = CopyDir(srcPath, dstPath) + if err != nil { + return err + } + } else { + err = CopyFile(srcPath, dstPath) + if err != nil { + return err + } + } + } + + return nil +} + +func CopyFile(src, dst string) error { + srcFile, err := os.Open(src) + if err != nil { + return err + } + defer srcFile.Close() + + dstFile, err := os.Create(dst) + if err != nil { + return err + } + defer dstFile.Close() + + _, err = io.Copy(dstFile, srcFile) + if err != nil { + return err + } + + err = dstFile.Sync() + if err != nil { + return err + } + + si, err := os.Stat(src) + if err != nil { + return err + } + err = os.Chmod(dst, si.Mode()) + if err != nil { + return err + } + + return nil +}