github.com/pavlo67/common@v0.5.3/common/ziplib/zip.go (about)

     1  package ziplib
     2  
     3  import (
     4  	"archive/zip"
     5  	"bytes"
     6  	"fmt"
     7  	"io"
     8  	"os"
     9  
    10  	"github.com/pkg/errors"
    11  )
    12  
    13  const onUnzipFile = "on ziplib.UnzipFile()"
    14  
    15  func UnzipFile(sourceFilename, filename string) ([]byte, error) {
    16  	r, err := zip.OpenReader(sourceFilename)
    17  	if err != nil {
    18  		return nil, fmt.Errorf(onUnzipFile+": can't zip.OpenReader(%s): %s", sourceFilename, err)
    19  	}
    20  	defer r.Close()
    21  
    22  	for _, f := range r.File {
    23  
    24  		if f.Name == filename || filename == "" {
    25  			if f.FileInfo().IsDir() {
    26  				return nil, fmt.Errorf(onUnzipFile+": requested file (%s) is a directory", filename)
    27  			}
    28  		}
    29  
    30  		rc, err := f.Open()
    31  		if err != nil {
    32  			return nil, fmt.Errorf(onUnzipFile+": on fOpen() got %s", err)
    33  		}
    34  
    35  		buffer := bytes.NewBuffer(nil)
    36  		_, err = io.Copy(buffer, rc)
    37  		rc.Close()
    38  
    39  		return buffer.Bytes(), nil
    40  	}
    41  
    42  	return nil, fmt.Errorf(onUnzipFile+": requested file (%s) isn't found", filename)
    43  }
    44  
    45  type ToZip struct {
    46  	Data     []byte
    47  	Filename string
    48  }
    49  
    50  const onZip = "on ziplib.Zip()"
    51  
    52  func ZipFiles(targetFilename string, content []ToZip, perm os.FileMode) ([]byte, error) {
    53  	buffer := bytes.NewBuffer(nil)
    54  	zipWriter := zip.NewWriter(buffer)
    55  
    56  	for _, c := range content {
    57  		w1, err := zipWriter.Create(c.Filename)
    58  		if err != nil {
    59  			return nil, errors.Wrap(err, onZip)
    60  		}
    61  		if _, err := io.Copy(w1, bytes.NewBuffer(c.Data)); err != nil {
    62  			return nil, errors.Wrap(err, onZip)
    63  		}
    64  	}
    65  	zipWriter.Close()
    66  
    67  	zippedBytes := buffer.Bytes()
    68  
    69  	if err := os.WriteFile(targetFilename, zippedBytes, perm); err != nil {
    70  		return nil, errors.Wrap(err, onZip)
    71  	}
    72  
    73  	return zippedBytes, nil
    74  }