PackageManager just because
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

129 lines
2.0 KiB

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)
}