github.com/IBM-Cloud/bluemix-go@v0.0.0-20240314082800-4e02a69b84b2/helpers/zip.go (about)

     1  package helpers
     2  
     3  import (
     4  	"archive/zip"
     5  	"io"
     6  	"os"
     7  	"path"
     8  	"path/filepath"
     9  )
    10  
    11  //Unzip src to dest
    12  func Unzip(src, dest string) error {
    13  	r, err := zip.OpenReader(src)
    14  	if err != nil {
    15  		return err
    16  	}
    17  	defer r.Close()
    18  
    19  	err = os.MkdirAll(dest, 0755)
    20  	if err != nil {
    21  		return err
    22  	}
    23  
    24  	for _, f := range r.File {
    25  		err := extractFileInZipArchive(dest, f)
    26  		if err != nil {
    27  			return err
    28  		}
    29  	}
    30  
    31  	return nil
    32  }
    33  
    34  func extractFileInZipArchive(dest string, f *zip.File) error {
    35  	rc, err := f.Open()
    36  	if err != nil {
    37  		return err
    38  	}
    39  	defer rc.Close()
    40  
    41  	path := filepath.Join(path.Clean(dest), path.Clean(f.Name))
    42  
    43  	if f.FileInfo().IsDir() {
    44  		return os.MkdirAll(path, f.Mode())
    45  	}
    46  	err = os.MkdirAll(filepath.Dir(path), f.Mode())
    47  	if err != nil {
    48  		return err
    49  	}
    50  	zf, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
    51  	if err != nil {
    52  		return err
    53  	}
    54  	defer zf.Close()
    55  	_, err = io.Copy(zf, rc)
    56  	return err
    57  }