package Archive import ( "archive/tar" "compress/gzip" "io" "os" "path/filepath" "strings" ) func Gzip(source, target string) error { var ( reader, writer *os.File archiver *gzip.Writer filename string e error ) reader, e = os.Open(source) if e != nil { return e } //filename = filepath.Base(source) //target = filepath.Join(target, fmt.Sprintf("%s.gz", filename)) writer, e = os.Create(target) if e != nil { return e } defer writer.Close() archiver = gzip.NewWriter(writer) archiver.Name = filename defer archiver.Close() _, e = io.Copy(archiver, reader) return e } func Tar(source, target string) error { var ( tarfile, file *os.File tarball *tar.Writer info os.FileInfo header *tar.Header e error ) tarfile, e = os.Create(target) if e != nil { return e } defer tarfile.Close() tarball = tar.NewWriter(tarfile) defer tarball.Close() info, e = os.Stat(source) if e != nil { return e } var baseDir string if info.IsDir() { baseDir = filepath.Base(source) } return filepath.Walk(source, func(path string, info os.FileInfo, e error) error { if e != nil { return e } header, e = tar.FileInfoHeader(info, info.Name()) if e != nil { return e } if baseDir != "" { header.Name = filepath.Join( baseDir, strings.TrimPrefix( strings.Join(strings.Split(path, "/")[1:], "/"), source, ), ) } e = tarball.WriteHeader(header) if e != nil { return e } if info.IsDir() { return nil } file, e = os.Open(path) if e != nil { return e } defer file.Close() _, e = io.Copy(tarball, file) return e }) } func TarGzip(source, target string) error { var ( tarPath string = strings.ReplaceAll(target, ".gz", "") e error ) e = Tar(source, tarPath) if e != nil { return e } e = Gzip(tarPath, target) if e != nil { return e } return os.Remove(tarPath) }