func Unzip(zipFile string, destDir string) error {
zipReader, err := zip.OpenReader(zipFile)
if
err != nil {
return
err
}
defer zipReader.Close()
var
decodeName string
for
_, f := range zipReader.File {
if
f.Flags == 0{
i:= bytes.NewReader([]byte(f.Name))
decoder := transform.NewReader(i, simplifiedchinese.GB18030.NewDecoder())
content,_:= ioutil.ReadAll(decoder)
decodeName = string(content)
}
else
{
decodeName = f.Name
}
fpath := filepath.Join(destDir, decodeName)
if
f.FileInfo().IsDir() {
os.MkdirAll(fpath, os.ModePerm)
}
else
{
if
err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
return
err
}
inFile, err := f.Open()
if
err != nil {
return
err
}
defer inFile.Close()
outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if
err != nil {
return
err
}
defer outFile.Close()
_, err = io.
Copy
(outFile, inFile)
if
err != nil {
return
err
}
}
}
return
nil
}