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