105 lines
1.8 KiB
Go
105 lines
1.8 KiB
Go
/*
|
|
* @Descripttion:
|
|
* @version:
|
|
* @Author: lfzxs@qq.com
|
|
* @Date: 2023-09-20 16:06:07
|
|
* @LastEditors: lfzxs@qq.com
|
|
* @LastEditTime: 2023-09-21 16:48:23
|
|
*/
|
|
package utils
|
|
|
|
import (
|
|
"archive/zip"
|
|
"bytes"
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"golang.org/x/exp/slog"
|
|
)
|
|
|
|
func ZipCompress(dirPath string, zipPath string) error {
|
|
|
|
// 创建一个缓冲区来存储压缩后的数据
|
|
buf := new(bytes.Buffer)
|
|
|
|
// 创建一个zip.Writer
|
|
zipWriter := zip.NewWriter(buf)
|
|
|
|
// 遍历目录下的文件和子目录
|
|
err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 构建在zip中的相对路径
|
|
relPath, err := filepath.Rel(dirPath, path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 判断是否为文件
|
|
if !info.IsDir() {
|
|
// 将文件添加到zip中
|
|
zipFile, err := zipWriter.Create(relPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 打开文件并复制到zip中
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer file.Close()
|
|
|
|
_, err = io.Copy(zipFile, file)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
|
|
|
|
if err != nil {
|
|
slog.Error("遍历目录失败:","error",err)
|
|
return err
|
|
}
|
|
|
|
// 关闭zip写入器
|
|
err = zipWriter.Close()
|
|
if err != nil {
|
|
slog.Error("关闭zip写入器失败:","error",err)
|
|
return err
|
|
}
|
|
|
|
// 将压缩后的数据写入文件
|
|
fpath := filepath.Dir(zipPath)
|
|
_,err = PathExists(fpath)
|
|
|
|
if err != nil {
|
|
slog.Error("创建压缩文件失败:","error",err)
|
|
return err
|
|
}
|
|
|
|
zipFile, err := os.Create(zipPath)
|
|
if err != nil {
|
|
slog.Error("创建压缩文件失败:","error",err)
|
|
return err
|
|
}
|
|
defer zipFile.Close()
|
|
|
|
// 将压缩后的数据复制到文件中
|
|
_, err = io.Copy(zipFile, buf)
|
|
if err != nil {
|
|
slog.Error("复制压缩数据到文件失败:","error",err)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|