LingxinMeng 9 miesięcy temu
rodzic
commit
75160b8afe
1 zmienionych plików z 25 dodań i 12 usunięć
  1. 25 12
      common/util/u_io.go

+ 25 - 12
common/util/u_io.go

@@ -13,38 +13,43 @@ import (
 
 // 压缩指定目录到ZIP文件,并排除一个指定的子目录
 func ZipDir(src, dest, excludeDir string) error {
+	// 1. 创建目标文件
 	zipf, err := os.Create(dest)
 	if err != nil {
 		return err
 	}
 	defer zipf.Close()
 
+	// 2. 创建ZIP写入器
 	archive := zip.NewWriter(zipf)
 	defer archive.Close()
 
-	filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
+	// 3. 遍历目录
+	err = filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
 		if err != nil {
 			return err
 		}
 
-		header, err := zip.FileInfoHeader(info)
+		// 生成相对路径
+		relPath, err := filepath.Rel(src, path)
 		if err != nil {
 			return err
 		}
 
-		// 修正文件路径,使其相对于src
-		header.Name, err = filepath.Rel(src, path)
+		// 判断是否为排除目录或其子目录
+		if strings.HasPrefix(relPath, excludeDir) {
+			if info.IsDir() {
+				return filepath.SkipDir // 跳过整个目录
+			}
+			return nil // 忽略该文件
+		}
+
+		header, err := zip.FileInfoHeader(info)
 		if err != nil {
 			return err
 		}
 
-		// 如果路径包含要排除的目录,则跳过
-		if strings.Contains(header.Name, excludeDir) {
-			if info.IsDir() {
-				return filepath.SkipDir // 如果是目录,则跳过整个目录
-			}
-			return nil // 如果是文件,则忽略该文件
-		}
+		header.Name = relPath
 
 		if info.IsDir() {
 			header.Name += "/"
@@ -63,12 +68,20 @@ func ZipDir(src, dest, excludeDir string) error {
 				return err
 			}
 			defer file.Close()
+
 			_, err = io.Copy(writer, file)
-			return err
+			if err != nil {
+				return err
+			}
 		}
+
 		return nil
 	})
 
+	if err != nil {
+		return err
+	}
+
 	return nil
 }