zip.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package bundle_packager
  2. import (
  3. "archive/zip"
  4. "io"
  5. "os"
  6. )
  7. type ZipBundlePackager struct {
  8. *MemoryZipBundlePackager
  9. path string
  10. }
  11. func NewZipBundlePackager(path string) (BundlePackager, error) {
  12. zipFile, err := os.Open(path)
  13. if err != nil {
  14. return nil, err
  15. }
  16. defer zipFile.Close()
  17. zipBytes, err := io.ReadAll(zipFile)
  18. if err != nil {
  19. return nil, err
  20. }
  21. memoryPackager, err := NewMemoryZipBundlePackager(zipBytes)
  22. if err != nil {
  23. return nil, err
  24. }
  25. zipBundlePackager := &ZipBundlePackager{
  26. MemoryZipBundlePackager: memoryPackager,
  27. path: path,
  28. }
  29. return zipBundlePackager, nil
  30. }
  31. func (p *ZipBundlePackager) Save() error {
  32. // export the bundle to a zip file
  33. zipBytes, err := p.Export()
  34. if err != nil {
  35. return err
  36. }
  37. // save the zip file
  38. err = os.WriteFile(p.path, zipBytes, 0644)
  39. if err != nil {
  40. return err
  41. }
  42. // reload zip reader
  43. zipFile, err := os.Open(p.path)
  44. if err != nil {
  45. return err
  46. }
  47. defer zipFile.Close()
  48. zipFileInfo, err := zipFile.Stat()
  49. if err != nil {
  50. return err
  51. }
  52. p.zipReader, err = zip.NewReader(zipFile, zipFileInfo.Size())
  53. if err != nil {
  54. return err
  55. }
  56. return nil
  57. }