read.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package zip
  2. import (
  3. "archive/zip"
  4. "os"
  5. "strings"
  6. )
  7. // OpenFile is the generalized open call; most users will use Open
  8. // instead. It opens the named zip file with specified flag
  9. // (O_RDONLY etc.) if applicable. If successful,
  10. // methods on the returned ZipArchive can be used for I/O.
  11. // If there is an error, it will be of type *PathError.
  12. func (z *ZipArchive) Open(name string, flag int, perm os.FileMode) error {
  13. // Create a new archive if it's specified and not exist.
  14. if flag&os.O_CREATE != 0 {
  15. f, err := os.Create(name)
  16. if err != nil {
  17. return err
  18. }
  19. zw := zip.NewWriter(f)
  20. if err = zw.Close(); err != nil {
  21. return err
  22. }
  23. }
  24. rc, err := zip.OpenReader(name)
  25. if err != nil {
  26. return err
  27. }
  28. z.ReadCloser = rc
  29. z.FileName = name
  30. z.Comment = rc.Comment
  31. z.NumFiles = len(rc.File)
  32. z.Flag = flag
  33. z.Permission = perm
  34. z.isHasChanged = false
  35. z.files = make([]*File, z.NumFiles)
  36. for i, f := range rc.File {
  37. z.files[i] = &File{}
  38. z.files[i].FileHeader, err = zip.FileInfoHeader(f.FileInfo())
  39. if err != nil {
  40. return err
  41. }
  42. z.files[i].Name = strings.Replace(f.Name, "\\", "/", -1)
  43. if f.FileInfo().IsDir() && !strings.HasSuffix(z.files[i].Name, "/") {
  44. z.files[i].Name += "/"
  45. }
  46. }
  47. return nil
  48. }