Skip to content

Instantly share code, notes, and snippets.

@jeremysmitherman
Created July 30, 2020 02:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jeremysmitherman/5f0921a16f2a65251fd2c5f098bb9ab0 to your computer and use it in GitHub Desktop.
Save jeremysmitherman/5f0921a16f2a65251fd2c5f098bb9ab0 to your computer and use it in GitHub Desktop.
package fileio
import (
"archive/zip"
"fmt"
"io"
"os"
"path/filepath"
"strings"
)
type MizZipper interface {
Unzip(zipfile string, tmpDestFolder string) ([]string, error)
Zip(targetFolder string)
}
type dcsMizZipper struct {}
func NewDcsMizZipper() MizZipper {
return dcsMizZipper{}
}
func (m dcsMizZipper) Unzip(zipfile string, tmpDestFolder string) ([]string, error) {
readcloser, _ := zip.OpenReader(zipfile)
defer readcloser.Close()
var filenames []string
for _, f := range readcloser.File {
filename := filepath.Join(tmpDestFolder, f.Name)
err := os.MkdirAll(filepath.Dir(filename), os.ModePerm)
if err != nil {
return filenames, err
}
newFile, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
return filenames, err
}
rc, err := f.Open()
if err != nil {
return filenames, err
}
_, err = io.Copy(newFile, rc)
filenames = append(filenames,filename)
newFile.Close()
rc.Close()
if err != nil {
return filenames, err
}
}
return filenames, nil
}
func (m dcsMizZipper) Zip(targetFolder string) {
newZipFile, err := os.Create(d.Zipfile + "_copy")
if err != nil {
panic(err)
}
defer newZipFile.Close()
zipWriter := zip.NewWriter(newZipFile)
defer zipWriter.Close()
err = filepath.Walk(targetFolder, func(path string, info os.FileInfo, err error) error {
if !info.IsDir() {
file, err := os.Open(path)
if err != nil {
panic(err)
}
defer file.Close()
newInfo, err := file.Stat()
header, err := zip.FileInfoHeader(newInfo)
if err != nil {
panic(err)
}
header.Method = zip.Deflate
header.Name = strings.ReplaceAll(filepath.Clean(path), targetFolder + "\\", "")
fmt.Println(header.Name)
writer, err := zipWriter.CreateHeader(header)
if err != nil {
panic(err)
}
_, err = io.Copy(writer, file)
if err != nil {
panic(err)
}
}
return nil
})
if err != nil {
panic(err)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment