63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
package util
|
|
|
|
import (
|
|
"archive/zip"
|
|
"bytes"
|
|
"golang.org/x/text/encoding/simplifiedchinese"
|
|
"golang.org/x/text/transform"
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
//压缩文件解压到指定目录
|
|
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 {
|
|
//如果标致位是0 则是默认的本地编码 默认为gbk
|
|
i := bytes.NewReader([]byte(f.Name))
|
|
decoder := transform.NewReader(i, simplifiedchinese.GB18030.NewDecoder())
|
|
content, _ := ioutil.ReadAll(decoder)
|
|
decodeName = string(content)
|
|
} else {
|
|
//如果标志为是 1 << 11也就是 2048 则是utf-8编码
|
|
decodeName = f.Name
|
|
}
|
|
fpath := filepath.Join(destDir, decodeName)
|
|
if f.FileInfo().IsDir() {
|
|
err:=os.MkdirAll(fpath, os.ModePerm)
|
|
if err!=nil{
|
|
return err
|
|
}
|
|
} 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
|
|
} |