zip_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package test
  2. import (
  3. "archive/zip"
  4. "fmt"
  5. "io"
  6. "os"
  7. "os/exec"
  8. "path/filepath"
  9. "strings"
  10. "testing"
  11. )
  12. func TestZip(t *testing.T) {
  13. //src := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20)"
  14. //dest := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20).zip"
  15. //excludeDir := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20)\\搜索引擎" // 你想排除的子目录
  16. //err := ZipDir(src, dest, excludeDir)
  17. //if err != nil {
  18. // fmt.Println("Error:", err)
  19. // return
  20. //}
  21. //fmt.Println("Zip created successfully:", dest)
  22. ZipDir2("/root/pjirobot/data/", "/root/pjirobot/data.zip", []string{"config", "map", "mapBuf"})
  23. }
  24. // 压缩指定目录到ZIP文件,并排除一个指定的子目录
  25. func ZipDir(src, dest, excludeDir string) error {
  26. zipf, err := os.Create(dest)
  27. if err != nil {
  28. return err
  29. }
  30. defer zipf.Close()
  31. archive := zip.NewWriter(zipf)
  32. defer archive.Close()
  33. filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
  34. if err != nil {
  35. return err
  36. }
  37. header, err := zip.FileInfoHeader(info)
  38. if err != nil {
  39. return err
  40. }
  41. // 修正文件路径,使其相对于src
  42. header.Name, err = filepath.Rel(src, path)
  43. if err != nil {
  44. return err
  45. }
  46. // 如果路径包含要排除的目录,则跳过
  47. if strings.Contains(header.Name, excludeDir) {
  48. if info.IsDir() {
  49. return filepath.SkipDir // 如果是目录,则跳过整个目录
  50. }
  51. return nil // 如果是文件,则忽略该文件
  52. }
  53. if info.IsDir() {
  54. header.Name += "/"
  55. } else {
  56. header.Method = zip.Deflate
  57. }
  58. writer, err := archive.CreateHeader(header)
  59. if err != nil {
  60. return err
  61. }
  62. if !info.IsDir() {
  63. file, err := os.Open(path)
  64. if err != nil {
  65. return err
  66. }
  67. defer file.Close()
  68. _, err = io.Copy(writer, file)
  69. return err
  70. }
  71. return nil
  72. })
  73. return nil
  74. }
  75. func ZipDir2(src string, dest string, dirs []string) {
  76. // 创建 zip 命令参数
  77. args := []string{"-r", dest}
  78. for _, dir := range dirs {
  79. args = append(args, filepath.Join(src, dir))
  80. }
  81. // 创建 zip 命令
  82. cmd := exec.Command("zip", args...)
  83. // 设置工作目录
  84. cmd.Dir = src
  85. // 执行 zip 命令并获取输出
  86. fmt.Println(args)
  87. }