// ExtractToFunc extracts the whole archive or the given files to the // specified destination. // It accepts a function as a middleware for custom operations. func (z *ZipArchive) ExtractToFunc(destPath string, fn cae.HookFunc, entries ...string) (err error) { destPath = strings.Replace(destPath, "\\", "/", -1) isHasEntry := len(entries) > 0 if Verbose { fmt.Println("Unzipping " + z.FileName + "...") } os.MkdirAll(destPath, os.ModePerm) for _, f := range z.File { f.Name = strings.Replace(f.Name, "\\", "/", -1) // Directory. if strings.HasSuffix(f.Name, "/") { if isHasEntry { if cae.IsEntry(f.Name, entries) { if err = fn(f.Name, f.FileInfo()); err != nil { continue } os.MkdirAll(path.Join(destPath, f.Name), os.ModePerm) } continue } if err = fn(f.Name, f.FileInfo()); err != nil { continue } os.MkdirAll(path.Join(destPath, f.Name), os.ModePerm) continue } // File. if isHasEntry { if cae.IsEntry(f.Name, entries) { if err = fn(f.Name, f.FileInfo()); err != nil { continue } err = extractFile(f, destPath) } } else { if err = fn(f.Name, f.FileInfo()); err != nil { continue } err = extractFile(f, destPath) } if err != nil { return err } } return nil }
// ExtractTo extracts the whole archive or the given files to the // specified destination. // It accepts a function as a middleware for custom operations. func (tz *TzArchive) ExtractToFunc(destPath string, fn cae.HookFunc, entries ...string) (err error) { destPath = strings.Replace(destPath, "\\", "/", -1) isHasEntry := len(entries) > 0 if Verbose { fmt.Println("Extracting " + tz.FileName + "...") } os.MkdirAll(destPath, os.ModePerm) // Copy post-added files. for _, f := range tz.files { if !cae.IsExist(f.absPath) { continue } relPath := path.Join(destPath, f.Name) os.MkdirAll(path.Dir(relPath), os.ModePerm) if err := cae.Copy(relPath, f.absPath); err != nil { return err } } tr, f, err := openFile(tz.FileName) if err != nil { return err } defer f.Close() for { h, err := tr.Next() if err == io.EOF { break } else if err != nil { return err } h.Name = strings.Replace(h.Name, "\\", "/", -1) // Directory. if h.Typeflag == tar.TypeDir { if isHasEntry { if cae.IsEntry(h.Name, entries) { if err = fn(h.Name, h.FileInfo()); err != nil { continue } os.MkdirAll(path.Join(destPath, h.Name), os.ModePerm) } continue } if err = fn(h.Name, h.FileInfo()); err != nil { continue } os.MkdirAll(path.Join(destPath, h.Name), os.ModePerm) continue } // File. if isHasEntry { if cae.IsEntry(h.Name, entries) { if err = fn(h.Name, h.FileInfo()); err != nil { continue } err = extractFile(h, tr, destPath) } } else { if err = fn(h.Name, h.FileInfo()); err != nil { continue } err = extractFile(h, tr, destPath) } if err != nil { return err } } return nil }