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 }