From 10addaf4ca99a21a03c5ba2049659c0da4210273 Mon Sep 17 00:00:00 2001 From: netbenix Date: Fri, 19 Nov 2021 19:35:55 +0100 Subject: [PATCH] Added compression --- Compression.go | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 Compression.go diff --git a/Compression.go b/Compression.go new file mode 100644 index 0000000..17fdd5a --- /dev/null +++ b/Compression.go @@ -0,0 +1,81 @@ +package main + +import ( + "archive/tar" + "bytes" + "compress/flate" + "compress/gzip" + "fmt" + "io" + "os" + "path/filepath" + "scabiosa/Logging" +) + +func CreateBakFile(filename string, folderPath string, destinationPath string) string { + logger := Logging.DetailedLogger("Compression", "CreateBakFile") + + var buf bytes.Buffer + compress(folderPath, &buf) + + fileName := filename + ".bak" + + fileToWrite, err := os.OpenFile(destinationPath + string(os.PathSeparator) + fileName, os.O_CREATE|os.O_RDWR, os.FileMode(600)) + if err != nil { + logger.Fatal(err) + } + + if _, err := io.Copy(fileToWrite, &buf); err != nil { + logger.Fatal(err) + } + + return fileName +} + + +func compress(folderPath string, buf io.Writer){ + logger := Logging.DetailedLogger("Gzip", "compress") + + zr, _ := gzip.NewWriterLevel(buf, flate.BestCompression) + tw := tar.NewWriter(zr) + + fmt.Printf("[%s] Start compression...\n", filepath.Base(folderPath)) + + filepath.Walk(folderPath, func(file string, fi os.FileInfo, err error) error { + header, err := tar.FileInfoHeader(fi, file) + if err != nil { + logger.Fatal(err) + } + + relPath, _ := filepath.Rel(filepath.Dir(folderPath), file) + + header.Name = relPath + if err := tw.WriteHeader(header); err != nil { + logger.Fatal(err) + } + + if !fi.IsDir(){ + data, err := os.Open(file) + if err != nil { + logger.Fatal(err) + } + + fmt.Printf("[%s] Compressing: %s (%d bytes)\n", filepath.Base(folderPath) ,relPath, fi.Size()) + if _, err := io.Copy(tw, data); err != nil { + logger.Fatal(err) + } + } + return nil + }) + + if err := tw.Close(); err != nil { + logger.Fatal(err) + } + + if err := zr.Close(); err != nil { + logger.Fatal(err) + } + + + fmt.Printf("[%s] Compression Done.\n", filepath.Base(folderPath)) +} \ No newline at end of file