pgzip是个利用多核压缩的库,github.com/klauspost/pgzip
废话不多说直接上代码!!!,被压缩的可以是文件,文件夹,一些文件创建的基本方法就不展示了,核心就是一下流程
import (
"archive/tar"
"github.com/klauspost/pgzip"
"io"
"io/fs"
"os"
"runtime"
"strings"
)
func Compress(destFile string, s ...string) error {
d, _ := CreateFile(destFile)
defer d.Close()
gw, err := pgzip.NewWriterLevel(d, 6)
if err != nil {
return err
}
err = gw.SetConcurrency(2<<20, runtime.GOMAXPROCS(0))
if err != nil {
return err
}
defer gw.Close()
tw := tar.NewWriter(gw)
defer tw.Close()
for _, v := range s {
f, err := os.Open(v)
if err != nil {
return err
}
err = compress(f, "", tw)
if err != nil {
return err
}
}
return nil
}
// DeCompress /usr/aaa.tar.gz /usr/tmp/
func compress(file *os.File, prefix string, tw *tar.Writer) error {
info, err := file.Stat()
if err != nil {
return err
}
if info.IsDir() {
if prefix != "" {
prefix = prefix + "/" + info.Name()
} else {
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, "")
if prefix != "" {
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 CreateFile(file string) (*os.File, error) {
file = strings.Replace(file, "\\", "/", -1)
err := os.MkdirAll(path.Dir(substr(file, 0, strings.LastIndex(file, "/")+1)), os.ModePerm)
if err != nil {
return nil, err
}
if fileutil.IsExist(file) {
err = os.Remove(file)
if err != nil {
return nil, err
}
}
return os.Create(file)
}
func FormatDir(dir string) string {
dir = gstr.Replace(dir, "\\", "/")
if !strings.HasSuffix(dir, "/") {
dir = dir + "/"
}
return dir
}
err := Compress(
"D:\\ChromeCoreDownloads\\云盘缓存\\a.tgz",
"D:\\ChromeCoreDownloads\\Dockerfile",
"D:\\ChromeCoreDownloads\\插件\\igg_install",
)
if err != nil {
fmt.Println(err)
}
err = DeCompress("D:\\ChromeCoreDownloads\\云盘缓存\\a.tgz",
"D:\\ChromeCoreDownloads\\云盘缓存\\")
if err != nil {
fmt.Println(err)
}