github.com/cobalt77/jfrog-client-go@v0.14.5/utils/io/fileutils/zip.go (about)

     1  package fileutils
     2  
     3  import (
     4  	"archive/zip"
     5  	"io"
     6  	"os"
     7  	"path/filepath"
     8  	"strings"
     9  
    10  	"github.com/cobalt77/jfrog-client-go/utils/errorutils"
    11  )
    12  
    13  func IsZip(filename string) bool {
    14  	return strings.HasSuffix(strings.ToLower(filename), ".zip")
    15  }
    16  
    17  func Unzip(at io.ReaderAt, size int64, dest string) error {
    18  	r, err := zip.NewReader(at, size)
    19  	if err != nil {
    20  		return err
    21  	}
    22  
    23  	os.MkdirAll(dest, 0755)
    24  	// Closure to address file descriptors issue with all the deferred .Close() methods
    25  	extractAndWriteFile := func(f *zip.File) error {
    26  		rc, err := f.Open()
    27  		if err != nil {
    28  			return err
    29  		}
    30  		defer func() {
    31  			if err := rc.Close(); err != nil {
    32  				panic(err)
    33  			}
    34  		}()
    35  
    36  		path := filepath.Join(dest, f.Name)
    37  
    38  		if f.FileInfo().IsDir() {
    39  			os.MkdirAll(path, 0700)
    40  		} else {
    41  			os.MkdirAll(filepath.Dir(path), 0700)
    42  			f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0700)
    43  			if err != nil {
    44  				return err
    45  			}
    46  			defer func() {
    47  				if err := f.Close(); err != nil {
    48  					panic(err)
    49  				}
    50  			}()
    51  
    52  			_, err = io.Copy(f, rc)
    53  			if err != nil {
    54  				return err
    55  			}
    56  		}
    57  		return nil
    58  	}
    59  
    60  	for _, f := range r.File {
    61  		err := extractAndWriteFile(f)
    62  		if err != nil {
    63  			return err
    64  		}
    65  	}
    66  
    67  	return nil
    68  }
    69  
    70  func ZipFolderFiles(source, target string) (err error) {
    71  	zipFile, err := os.Create(target)
    72  	if err != nil {
    73  		errorutils.CheckError(err)
    74  		return
    75  	}
    76  	defer func() {
    77  		if cerr := zipFile.Close(); cerr != nil && err == nil {
    78  			err = cerr
    79  		}
    80  	}()
    81  
    82  	archive := zip.NewWriter(zipFile)
    83  	defer func() {
    84  		if cerr := archive.Close(); cerr != nil && err == nil {
    85  			err = cerr
    86  		}
    87  	}()
    88  
    89  	filepath.Walk(source, func(path string, info os.FileInfo, err error) (currentErr error) {
    90  		if info.IsDir() {
    91  			return
    92  		}
    93  
    94  		if err != nil {
    95  			currentErr = err
    96  			return
    97  		}
    98  
    99  		header, currentErr := zip.FileInfoHeader(info)
   100  		if currentErr != nil {
   101  			errorutils.CheckError(currentErr)
   102  			return
   103  		}
   104  
   105  		header.Method = zip.Deflate
   106  		writer, currentErr := archive.CreateHeader(header)
   107  		if currentErr != nil {
   108  			errorutils.CheckError(currentErr)
   109  			return
   110  		}
   111  
   112  		file, currentErr := os.Open(path)
   113  		if currentErr != nil {
   114  			errorutils.CheckError(currentErr)
   115  			return
   116  		}
   117  		defer func() {
   118  			if cerr := file.Close(); cerr != nil && currentErr == nil {
   119  				currentErr = cerr
   120  			}
   121  		}()
   122  		_, currentErr = io.Copy(writer, file)
   123  		return
   124  	})
   125  	return
   126  }