压缩和解压.tar.gz文件
压缩
func Compress(files []*os.File, dest string) error {
d, _ := os.Create(dest)
defer d.Close()
gw := gzip.NewWriter(d)
defer gw.Close()
tw := tar.NewWriter(gw)
defer tw.Close()
for _, file := range files {
err := compress(file, "", tw)
if err != nil {
return err
}
}
return nil
}
func compress(file *os.File, prefix string, tw *tar.Writer) error {
info, err := file.Stat()
if err != nil {
return err
}
if info.IsDir() {
prefix = prefix + "/" + info.Name()
fileInfos, err := file.Readdir(-1)
if err != nil {
return err
}
for _, fi := range fileInfos {
f, err := os.Open(file.Name() + "/" + fi.Name())
if err != nil {
return err
}
err = compress(f, prefix, tw)
if err != nil {
return err
}
}
} else {
header, err := tar.FileInfoHeader(info, "")
header.Name = prefix + "/" + header.Name
if err != nil {
return err
}
err = tw.WriteHeader(header)
if err != nil {
return err
}
_, err = io.Copy(tw, file)
file.Close()
if err != nil {
return err
}
}
return nil
}
测试
func TestTarGz(t *testing.T) {
output := "done.tar.gz"
file1, _ := os.Open("11.parquet")
file2, _ := os.Open("22.toml")
var files []*os.File
files = append(files, file1)
files = append(files, file2)
utils.Compress(files, output)
}
解压
func DeCompressTarGz(tarFile, dest string) (string, error) {
srcFile, err := os.Open(tarFile)
if err != nil {
return "", err
}
defer srcFile.Close()
gr, err := gzip.NewReader(srcFile)
if err != nil {
return "", err
}
defer gr.Close()
tr := tar.NewReader(gr)
for {
hdr, err := tr.Next()
if err != nil {
if err == io.EOF {
break
} else {
return "", err
}
}
filename := dest + hdr.Name
file, err := createFile(filename)
if err != nil {
return "", err
}
io.Copy(file, tr)
if !strings.Contains(filename, ".toml") {
return filename, nil
}
}
return "", nil
}