压缩指定一个或多个目录下指定的一个或多个文件,自定义压缩后的包名及地址
package util
import (
"archive/zip"
"com.arcvideo.box/logger"
"io"
"os"
"path/filepath"
"strings"
)
//参数介绍
//dest:目的地址以及压缩文件名 eg:/data/logZip/2022-12-12-log.zip
//paths:需要压缩的所有文件所组成的集合
func Zip(dest string, paths []string) error {
zfile, err := os.Create(dest)
if err != nil {
logger.Log().Error(err)
return err
}
defer zfile.Close()
zipWriter := zip.NewWriter(zfile)
defer zipWriter.Close()
for _, src := range paths {
// 删除尾随路径(如果它是目录)
src := strings.TrimSuffix(src, string(os.PathSeparator))
err = filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
if err != nil {
logger.Log().Error(err)
return err
}
// 创建本地文件头
header, err := zip.FileInfoHeader(info)
if err != nil {
logger.Log().Error(err)
return err
}
// 将压缩方法设置为deflate
header.Method = zip.Deflate
// 在zip存档中设置文件的相对路径
header.Name, err = filepath.Rel(filepath.Dir(src), path)
if err != nil {
logger.Log().Error(err)
return err
}
if info.IsDir() {
header.Name += string(os.PathSeparator)
}
// 创建写入头的writer
headerWriter, err := zipWriter.CreateHeader(header)
if err != nil {
logger.Log().Error(err)
return err
}
if info.IsDir() {
logger.Log().Infof("info为空")
return nil
}
f, err := os.Open(path)
if err != nil {
logger.Log().Error(err)
return err
}
defer f.Close()
_, err = io.Copy(headerWriter, f)
logger.Log().Error(err)
return err
})
if err != nil {
logger.Log().Error(err)
return err
}
}
return nil
}