package utils import ( "fmt" "io" "log" "os" "path/filepath" "strings" "archive/zip" ) func CompressByFiles(fileNames []string, dest string) error { d, _ := os.Create(dest) defer d.Close() w := zip.NewWriter(d) defer w.Close() for _, fileName := range fileNames { file, err := os.Open(fileName) //defer file.Close() if err != nil { log.Println(err) return err } err = compress(file, "", w) if err != nil { log.Println(err) return err } } return nil } func compress(file *os.File, prefix string, zw *zip.Writer) error { info, err := file.Stat() if err != nil { log.Println(err) return err } header, err := zip.FileInfoHeader(info) header.Name = prefix + "/" + header.Name if err != nil { log.Println(err) return err } writer, err := zw.CreateHeader(header) if err != nil { log.Println(err) return err } _, err = io.Copy(writer, file) file.Close() if err != nil { log.Println(err) return err } return nil } func ZipDirectory(dirPath string, zipFilePath string) error { // 创建目标zip文件 zipFile, err := os.Create(zipFilePath) if err != nil { return err } defer zipFile.Close() // 创建zip.Writer写入目标文件 zipWriter := zip.NewWriter(zipFile) defer zipWriter.Close() // 递归遍历目录,将文件和子目录添加到zip.Writer中 err = filepath.Walk(dirPath, func(filePath string, info os.FileInfo, err error) error { if err != nil { return err } // 创建zip文件中的路径 relPath := strings.TrimPrefix(filePath, dirPath) zipPath := filepath.Join(filepath.Base(dirPath), relPath) // 如果是目录,则只创建目录而不添加文件 if info.IsDir() { _, err = zipWriter.Create(zipPath + "/") if err != nil { return err } } else { // 如果是文件,则创建文件并将内容写入zip.Writer中 file, err := os.Open(filePath) if err != nil { return err } defer file.Close() zipFile, err := zipWriter.Create(zipPath) if err != nil { return err } _, err = io.Copy(zipFile, file) if err != nil { return err } } return nil }) if err != nil { return err } fmt.Printf("目录 %s 已打包成文件 %s\n", dirPath, zipFilePath) return nil }