github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/zip_util_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"archive/zip"
     5  	"io"
     6  	"os"
     7  	"path/filepath"
     8  )
     9  
    10  func recreateDir(dir string) error {
    11  	err := os.RemoveAll(dir)
    12  	if err != nil {
    13  		return err
    14  	}
    15  	return os.MkdirAll(dir, 0755)
    16  }
    17  
    18  func createDirForFile(path string) error {
    19  	dir := filepath.Dir(path)
    20  	return os.MkdirAll(dir, 0755)
    21  }
    22  
    23  func unzipFile(f *zip.File, dstPath string) error {
    24  	r, err := f.Open()
    25  	if err != nil {
    26  		return err
    27  	}
    28  	defer r.Close()
    29  
    30  	err = createDirForFile(dstPath)
    31  	if err != nil {
    32  		return err
    33  	}
    34  
    35  	w, err := os.Create(dstPath)
    36  	if err != nil {
    37  		return err
    38  	}
    39  	_, err = io.Copy(w, r)
    40  	if err != nil {
    41  		w.Close()
    42  		os.Remove(dstPath)
    43  		return err
    44  	}
    45  	err = w.Close()
    46  	if err != nil {
    47  		os.Remove(dstPath)
    48  		return err
    49  	}
    50  	return nil
    51  }
    52  
    53  // Unzip unzips a given zip file to a given directory
    54  func unzip(zipPath string, destDir string) error {
    55  	st, err := os.Stat(zipPath)
    56  	if err != nil {
    57  		return err
    58  	}
    59  	fileSize := st.Size()
    60  	f, err := os.Open(zipPath)
    61  	if err != nil {
    62  		return err
    63  	}
    64  	defer f.Close()
    65  
    66  	zr, err := zip.NewReader(f, fileSize)
    67  	if err != nil {
    68  		return err
    69  	}
    70  	err = recreateDir(destDir)
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	for _, fi := range zr.File {
    76  		if fi.FileInfo().IsDir() {
    77  			continue
    78  		}
    79  		destPath := filepath.Join(destDir, fi.Name)
    80  		err = unzipFile(fi, destPath)
    81  		if err != nil {
    82  			os.RemoveAll(destDir)
    83  			return err
    84  		}
    85  	}
    86  	return nil
    87  }