zip.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package fileutil
  2. import (
  3. "archive/zip"
  4. "fmt"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. "strings"
  9. )
  10. /*
  11. UnzipFile extracts a given zip file into a given output folder.
  12. */
  13. func UnzipFile(name string, dest string, overwrite bool) error {
  14. var f *os.File
  15. stat, err := os.Stat(name)
  16. if err == nil {
  17. if f, err = os.Open(name); err == nil {
  18. defer f.Close()
  19. err = UnzipReader(f, stat.Size(), dest, overwrite)
  20. }
  21. }
  22. return err
  23. }
  24. /*
  25. UnzipReader extracts a given zip archive into a given output folder.
  26. Size is the size of the archive.
  27. */
  28. func UnzipReader(reader io.ReaderAt, size int64, dest string, overwrite bool) error {
  29. var rc io.ReadCloser
  30. r, err := zip.NewReader(reader, size)
  31. if err == nil {
  32. for _, f := range r.File {
  33. if rc, err = f.Open(); err == nil {
  34. var e bool
  35. fpath := filepath.Join(dest, f.Name)
  36. if e, _ = PathExists(fpath); e && !overwrite {
  37. err = fmt.Errorf("Path already exists: %v", fpath)
  38. } else if f.FileInfo().IsDir() {
  39. // Create folder
  40. err = os.MkdirAll(fpath, os.ModePerm)
  41. } else {
  42. var fdir string
  43. // Create File
  44. if lastIndex := strings.LastIndex(fpath, string(os.PathSeparator)); lastIndex > -1 {
  45. fdir = fpath[:lastIndex]
  46. }
  47. if err = os.MkdirAll(fdir, os.ModePerm); err == nil {
  48. f, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
  49. if err == nil {
  50. _, err = io.Copy(f, rc)
  51. f.Close()
  52. }
  53. }
  54. }
  55. rc.Close()
  56. }
  57. if err != nil {
  58. break
  59. }
  60. }
  61. }
  62. return err
  63. }