|
@@ -1,11 +1,11 @@
|
|
|
package util
|
|
|
|
|
|
import (
|
|
|
- "archive/zip"
|
|
|
"fmt"
|
|
|
"io"
|
|
|
"io/fs"
|
|
|
"os"
|
|
|
+ "os/exec"
|
|
|
"path/filepath"
|
|
|
"sort"
|
|
|
"strings"
|
|
@@ -13,73 +13,22 @@ import (
|
|
|
|
|
|
// 压缩指定目录到ZIP文件,并排除一个指定的子目录
|
|
|
func ZipDir(src, dest, excludeDir string) error {
|
|
|
- // 1. 创建目标文件
|
|
|
- zipf, err := os.Create(dest)
|
|
|
+ // 获取相对路径,以便用于排除目录
|
|
|
+ relExcludeDir, err := filepath.Rel(src, excludeDir)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- defer zipf.Close()
|
|
|
|
|
|
- // 2. 创建ZIP写入器
|
|
|
- archive := zip.NewWriter(zipf)
|
|
|
- defer archive.Close()
|
|
|
+ // 构建zip命令
|
|
|
+ cmd := exec.Command("zip", "-r", dest, ".", "-x", filepath.Join(relExcludeDir, "*"))
|
|
|
|
|
|
- // 3. 遍历目录
|
|
|
- err = filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- // 生成相对路径
|
|
|
- relPath, err := filepath.Rel(src, path)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- // 判断是否为排除目录或其子目录
|
|
|
- if strings.HasPrefix(relPath, excludeDir) {
|
|
|
- if info.IsDir() {
|
|
|
- return filepath.SkipDir // 跳过整个目录
|
|
|
- }
|
|
|
- return nil // 忽略该文件
|
|
|
- }
|
|
|
-
|
|
|
- header, err := zip.FileInfoHeader(info)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- header.Name = relPath
|
|
|
-
|
|
|
- if info.IsDir() {
|
|
|
- header.Name += "/"
|
|
|
- } else {
|
|
|
- header.Method = zip.Deflate
|
|
|
- }
|
|
|
-
|
|
|
- writer, err := archive.CreateHeader(header)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- if !info.IsDir() {
|
|
|
- file, err := os.Open(path)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- defer file.Close()
|
|
|
-
|
|
|
- _, err = io.Copy(writer, file)
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return nil
|
|
|
- })
|
|
|
+ // 设置工作目录为要压缩的源目录
|
|
|
+ cmd.Dir = src
|
|
|
|
|
|
+ // 运行命令并捕获输出
|
|
|
+ output, err := cmd.CombinedOutput()
|
|
|
if err != nil {
|
|
|
- return err
|
|
|
+ return fmt.Errorf("zip command failed: %v, output: %s", err, string(output))
|
|
|
}
|
|
|
|
|
|
return nil
|