/* * @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 }