| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 | package bundle_packagerimport (	"archive/zip"	"bytes"	"errors"	"io"	"os"	"strconv"	"strings")type ZipBundlePackager struct {	*MemoryZipBundlePackager	path string}func NewZipBundlePackager(path string) (BundlePackager, error) {	zipFile, err := os.Open(path)	if err != nil {		return nil, err	}	defer zipFile.Close()	zipBytes, err := io.ReadAll(zipFile)	if err != nil {		return nil, err	}	memoryPackager, err := NewMemoryZipBundlePackager(zipBytes)	if err != nil {		return nil, err	}	zipBundlePackager := &ZipBundlePackager{		MemoryZipBundlePackager: memoryPackager,		path:                    path,	}	return zipBundlePackager, nil}func NewZipBundlePackagerWithSizeLimit(path string, maxSize int64) (BundlePackager, error) {	zipFile, err := os.Open(path)	if err != nil {		return nil, err	}	defer zipFile.Close()	zipBytes, err := io.ReadAll(zipFile)	if err != nil {		return nil, err	}	reader, err := zip.NewReader(bytes.NewReader(zipBytes), int64(len(zipBytes)))	if err != nil {		return nil, errors.New(strings.ReplaceAll(err.Error(), "zip", "difypkg"))	}	totalSize := int64(0)	for _, file := range reader.File {		totalSize += int64(file.UncompressedSize64)		if totalSize > maxSize {			return nil, errors.New(				"bundle package size is too large, please ensure the uncompressed size is less than " +					strconv.FormatInt(maxSize, 10) + " bytes",			)		}	}	memoryPackager, err := NewMemoryZipBundlePackager(zipBytes)	if err != nil {		return nil, err	}	zipBundlePackager := &ZipBundlePackager{		MemoryZipBundlePackager: memoryPackager,		path:                    path,	}	return zipBundlePackager, nil}func (p *ZipBundlePackager) Save() error {	// export the bundle to a zip file	zipBytes, err := p.Export()	if err != nil {		return err	}	// save the zip file	err = os.WriteFile(p.path, zipBytes, 0644)	if err != nil {		return err	}	// reload zip reader	zipFile, err := os.Open(p.path)	if err != nil {		return err	}	defer zipFile.Close()	zipFileInfo, err := zipFile.Stat()	if err != nil {		return err	}	p.zipReader, err = zip.NewReader(zipFile, zipFileInfo.Size())	if err != nil {		return err	}	return nil}
 |