LingxinMeng 9 месяцев назад
Родитель
Сommit
fcda4eb298
1 измененных файлов с 84 добавлено и 0 удалено
  1. 84 0
      test/zip_test.go

+ 84 - 0
test/zip_test.go

@@ -0,0 +1,84 @@
+package test
+
+import (
+	"archive/zip"
+	"fmt"
+	"io"
+	"os"
+	"path/filepath"
+	"strings"
+	"testing"
+)
+
+func TestZip(t *testing.T) {
+	src := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20)"
+	dest := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20).zip"
+	excludeDir := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20)\\搜索引擎" // 你想排除的子目录
+	err := ZipDir(src, dest, excludeDir)
+	if err != nil {
+		fmt.Println("Error:", err)
+		return
+	}
+	fmt.Println("Zip created successfully:", dest)
+}
+
+// 压缩指定目录到ZIP文件,并排除一个指定的子目录
+func ZipDir(src, dest, excludeDir string) error {
+	zipf, err := os.Create(dest)
+	if err != nil {
+		return err
+	}
+	defer zipf.Close()
+
+	archive := zip.NewWriter(zipf)
+	defer archive.Close()
+
+	filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
+		if err != nil {
+			return err
+		}
+
+		header, err := zip.FileInfoHeader(info)
+		if err != nil {
+			return err
+		}
+
+		// 修正文件路径,使其相对于src
+		header.Name, err = filepath.Rel(src, path)
+		if err != nil {
+			return err
+		}
+
+		// 如果路径包含要排除的目录,则跳过
+		if strings.Contains(header.Name, excludeDir) {
+			if info.IsDir() {
+				return filepath.SkipDir // 如果是目录,则跳过整个目录
+			}
+			return nil // 如果是文件,则忽略该文件
+		}
+
+		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)
+			return err
+		}
+		return nil
+	})
+
+	return nil
+}