package utils import ( "archive/zip" "io" "os" "path" ) func Compress(files []*os.File, dest string) error { d, _ := os.Create(dest) defer d.Close() w := zip.NewWriter(d) defer w.Close() for _, file := range files { err := compress(file, "", w) if err != nil { return err } } return nil } func compress(file *os.File, prefix string, zw *zip.Writer) error { info, err := file.Stat() if err != nil { return err } if info.IsDir() { prefix = prefix + "/" + info.Name() fileInfos, err := file.Readdir(-1) if err != nil { return err } for _, fi := range fileInfos { f, err := os.Open(file.Name() + "/" + fi.Name()) if err != nil { return err } err = compress(f, prefix, zw) if err != nil { return err } } } else { header, err := zip.FileInfoHeader(info) header.Name = prefix + "/" + header.Name if err != nil { return err } writer, err := zw.CreateHeader(header) if err != nil { return err } _, err = io.Copy(writer, file) file.Close() if err != nil { return err } } return nil } func DeCompressZip(zipFile, dest string) error { reader, err := zip.OpenReader(zipFile) if err != nil { return err } defer reader.Close() for _, f := range reader.Reader.File { if f.FileInfo().IsDir() { fullPath := path.Join(dest, f.Name) err = os.MkdirAll(fullPath, os.ModePerm) if err != nil { return err } continue } r, err := f.Open() if err != nil { return err } defer r.Close() fullPath := path.Join(dest, f.Name) w, err := os.Create(fullPath) if err != nil { return err } defer w.Close() _, err = io.Copy(w, r) if err != nil { return err } } return nil }