zip.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package utils
  2. import (
  3. "archive/zip"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "os"
  8. "path/filepath"
  9. )
  10. // 解压文件
  11. func Unzip(src string) error {
  12. err := unzipFile(src, unzipTmp)
  13. if err != nil {
  14. fmt.Println("解压失败:", err)
  15. // 删除临时文件
  16. os.RemoveAll(unzipTmp)
  17. os.Remove(src)
  18. return errors.New("解压失败")
  19. }
  20. // 替换新旧文件
  21. os.RemoveAll(appPath)
  22. os.Rename(unzipTmp, appPath)
  23. // 删除下载的压缩文件
  24. os.Remove(src)
  25. // fmt.Println("解压成功!")
  26. return nil
  27. }
  28. func unzipFile(zipFile, destDir string) error {
  29. r, err := zip.OpenReader(zipFile)
  30. if err != nil {
  31. return err
  32. }
  33. defer r.Close()
  34. for _, f := range r.File {
  35. // 构建解压后的文件路径
  36. filePath := filepath.Join(destDir, f.Name)
  37. if f.FileInfo().IsDir() {
  38. // 创建目录
  39. os.MkdirAll(filePath, os.ModePerm)
  40. continue
  41. }
  42. // 创建父目录
  43. os.MkdirAll(filepath.Dir(filePath), os.ModePerm)
  44. // 打开zip文件中的文件
  45. rc, err := f.Open()
  46. if err != nil {
  47. return err
  48. }
  49. defer rc.Close()
  50. // 创建解压后的文件
  51. outFile, err := os.Create(filePath)
  52. if err != nil {
  53. return err
  54. }
  55. defer outFile.Close()
  56. // 将zip文件中的内容复制到解压后的文件中
  57. _, err = io.Copy(outFile, rc)
  58. if err != nil {
  59. return err
  60. }
  61. }
  62. return nil
  63. }