code: func (tz *TzArchive) Open(name string, flag int, perm os.FileMode) error {
  	if flag&os.O_CREATE != 0 {
  		fw, err := os.Create(name)
  		if err != nil {
  			return err
  		}
  
  		gw := gzip.NewWriter(fw)
  		tw := tar.NewWriter(gw)
  		if err = tw.Close(); err != nil {
  			return err
  		} else if err = gw.Close(); err != nil {
  			return err
  		} else if err = fw.Close(); err != nil {
  			return err
  		}
  	}
  
  	rc, err := openReader(name)
  	if err != nil {
  		return err
  	}
  
  	tz.ReadCloser = rc
  	tz.FileName = name
  	tz.NumFiles = len(rc.File)
  	tz.Flag = flag
  	tz.Permission = perm
  	tz.isHasChanged = false
  
  	tz.syncFiles()
  	return nil
  }
docs: // Open is the generalized open call; most users will use Open
  // instead. It opens the named tar.gz file with specified flag
  // (O_RDONLY etc.) if applicable. If successful,
  // methods on the returned TzArchive can be used for I/O.
  // If there is an error, it will be of type *PathError.