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 }