package starainrt import ( "archive/zip" "errors" "fmt" "io" "os" ) func Unzip(src, dst string, shell func(string)) error { if !IsFile(src) { return errors.New(src + " Not Exists") } if Exists(dst) && !IsFolder(dst) { return errors.New(dst + " Exists And Not A Folder") } if !Exists(dst) { err := os.MkdirAll(dst, 0644) if err != nil { return nil } } zipreader, err := zip.OpenReader(src) if err != nil { return err } defer zipreader.Close() for _, v := range zipreader.File { if v.FileInfo().IsDir() { err := os.MkdirAll(dst+string(os.PathSeparator)+v.Name, 0644) if err != nil { fmt.Println(err) } continue } fp, err := v.Open() if err != nil { fmt.Println(err) continue } go shell(v.Name) fpdst, err := os.Create(dst + string(os.PathSeparator) + v.Name) if err != nil { fmt.Println(err) continue } _, err = io.Copy(fpdst, fp) if err != nil { fmt.Println(err) } fp.Close() fpdst.Close() } return nil }