zip.go 902 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package filex
  2. import (
  3. "archive/zip"
  4. "fmt"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. )
  9. func UnzipTo(f *zip.File, fpath string) error {
  10. _, err := os.Stat(fpath)
  11. if f.FileInfo().IsDir() {
  12. // Make Folder
  13. if _, err := os.Stat(fpath); os.IsNotExist(err) {
  14. if err := os.MkdirAll(fpath, os.ModePerm); err != nil {
  15. return err
  16. }
  17. }
  18. return nil
  19. }
  20. if err == nil || !os.IsNotExist(err) {
  21. if err = os.RemoveAll(fpath); err != nil {
  22. return fmt.Errorf("failed to delete file %s", fpath)
  23. }
  24. }
  25. if _, err := os.Stat(filepath.Dir(fpath)); os.IsNotExist(err) {
  26. if err := os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
  27. return err
  28. }
  29. }
  30. outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
  31. if err != nil {
  32. return err
  33. }
  34. rc, err := f.Open()
  35. if err != nil {
  36. return err
  37. }
  38. _, err = io.Copy(outFile, rc)
  39. outFile.Close()
  40. rc.Close()
  41. return err
  42. }