package test import ( "archive/zip" "fmt" "io" "os" "os/exec" "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) ZipDir2("/root/pjirobot/data/", "/root/pjirobot/data.zip", []string{"config", "map", "mapBuf"}) } // 压缩指定目录到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 } func ZipDir2(src string, dest string, dirs []string) { // 创建 zip 命令参数 args := []string{"-r", dest} for _, dir := range dirs { args = append(args, filepath.Join(src, dir)) } // 创建 zip 命令 cmd := exec.Command("zip", args...) // 设置工作目录 cmd.Dir = src // 执行 zip 命令并获取输出 fmt.Println(args) }