go-view-server/internal/utils/zip.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
}