archive.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package core
  2. // @Title archive
  3. // @Description 创建和释放压缩包
  4. // @Author ila 2021-11-04 14:33:00
  5. // @Update ila
  6. import (
  7. "archive/zip"
  8. "io"
  9. "log"
  10. "os"
  11. "path/filepath"
  12. "strings"
  13. )
  14. // @title Unzip
  15. // @description 解压zip文件到指定路径,只解压文件名包含contains字符串的文件.
  16. // @auth ila 2021-11-04 14:33:00
  17. // @param zipPath zip文件路径,attachPath 解压路径,contains 包含的字符串
  18. // @return error 是否成功
  19. func Unzip(zipPath, attachPath string, contains []string) error {
  20. z, err := zip.OpenReader(zipPath)
  21. defer z.Close()
  22. if err != nil {
  23. return err
  24. }
  25. for _, f := range z.File {
  26. if f.FileInfo().IsDir() {
  27. continue
  28. }
  29. //判断文件名包含所需字符
  30. containFlag := false
  31. for _, c := range contains {
  32. if strings.Contains(f.Name, c) == true {
  33. containFlag = true
  34. break
  35. }
  36. }
  37. //文件名没有包含所需字符,跳过
  38. if containFlag == false {
  39. continue
  40. }
  41. path := filepath.Join(attachPath, f.Name)
  42. fo, err := f.Open()
  43. defer fo.Close()
  44. if err != nil {
  45. log.Printf("zip file Open error :%v\n", err)
  46. continue
  47. }
  48. fw, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR|os.O_TRUNC, f.Mode())
  49. defer fw.Close()
  50. if err != nil {
  51. continue
  52. }
  53. _, err = io.Copy(fw, fo)
  54. if err != nil {
  55. log.Printf("zip file write to attach error :%v\n", err)
  56. }
  57. }
  58. return nil
  59. }