zip_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package test
  2. import (
  3. "archive/zip"
  4. "fmt"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. "testing"
  10. )
  11. func TestZip(t *testing.T) {
  12. src := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20)"
  13. dest := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20).zip"
  14. excludeDir := "C:\\Users\\mlxengingin\\Desktop\\0813\\go从入门到通天(20)\\搜索引擎" // 你想排除的子目录
  15. err := ZipDir(src, dest, excludeDir)
  16. if err != nil {
  17. fmt.Println("Error:", err)
  18. return
  19. }
  20. fmt.Println("Zip created successfully:", dest)
  21. }
  22. // 压缩指定目录到ZIP文件,并排除一个指定的子目录
  23. func ZipDir(src, dest, excludeDir string) error {
  24. zipf, err := os.Create(dest)
  25. if err != nil {
  26. return err
  27. }
  28. defer zipf.Close()
  29. archive := zip.NewWriter(zipf)
  30. defer archive.Close()
  31. filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
  32. if err != nil {
  33. return err
  34. }
  35. header, err := zip.FileInfoHeader(info)
  36. if err != nil {
  37. return err
  38. }
  39. // 修正文件路径,使其相对于src
  40. header.Name, err = filepath.Rel(src, path)
  41. if err != nil {
  42. return err
  43. }
  44. // 如果路径包含要排除的目录,则跳过
  45. if strings.Contains(header.Name, excludeDir) {
  46. if info.IsDir() {
  47. return filepath.SkipDir // 如果是目录,则跳过整个目录
  48. }
  49. return nil // 如果是文件,则忽略该文件
  50. }
  51. if info.IsDir() {
  52. header.Name += "/"
  53. } else {
  54. header.Method = zip.Deflate
  55. }
  56. writer, err := archive.CreateHeader(header)
  57. if err != nil {
  58. return err
  59. }
  60. if !info.IsDir() {
  61. file, err := os.Open(path)
  62. if err != nil {
  63. return err
  64. }
  65. defer file.Close()
  66. _, err = io.Copy(writer, file)
  67. return err
  68. }
  69. return nil
  70. })
  71. return nil
  72. }