github.com/jfrog/jfrog-client-go@v1.40.2/utils/io/fileutils/zip.go (about)

     1  package fileutils
     2  
     3  import (
     4  	"archive/zip"
     5  	"errors"
     6  	"github.com/jfrog/jfrog-client-go/utils/errorutils"
     7  	"io"
     8  	"os"
     9  	"path/filepath"
    10  )
    11  
    12  func ZipFolderFiles(source, target string) (err error) {
    13  	zipFile, err := os.Create(target)
    14  	if err != nil {
    15  		return errorutils.CheckError(err)
    16  	}
    17  	defer func() {
    18  		err = errors.Join(errorutils.CheckError(zipFile.Close()))
    19  	}()
    20  
    21  	archive := zip.NewWriter(zipFile)
    22  	defer func() {
    23  		err = errors.Join(errorutils.CheckError(archive.Close()))
    24  	}()
    25  
    26  	return filepath.Walk(source, func(path string, info os.FileInfo, err error) (currentErr error) {
    27  		if info.IsDir() {
    28  			return
    29  		}
    30  
    31  		if currentErr = errors.Join(currentErr, err); currentErr != nil {
    32  			return
    33  		}
    34  
    35  		header, currentErr := zip.FileInfoHeader(info)
    36  		if currentErr != nil {
    37  			return errorutils.CheckError(currentErr)
    38  		}
    39  
    40  		header.Method = zip.Deflate
    41  		writer, currentErr := archive.CreateHeader(header)
    42  		if currentErr != nil {
    43  			return errorutils.CheckError(currentErr)
    44  		}
    45  
    46  		file, currentErr := os.Open(path)
    47  		if currentErr != nil {
    48  			return errorutils.CheckError(currentErr)
    49  		}
    50  		defer func() {
    51  			currentErr = errors.Join(errorutils.CheckError(file.Close()))
    52  		}()
    53  		_, currentErr = io.Copy(writer, file)
    54  		return
    55  	})
    56  }