|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"archive/zip"
|
|
|
|
|
"io"
|
|
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
|
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// 桌面应用升级方案,桌面应用更新研发
|
|
|
|
|
// https://blog.csdn.net/u012981972/article/details/109597211
|
|
|
|
|
// 自动解压
|
|
|
|
|
func Unzip(zipFile string, destDir string) error {
|
|
|
|
|
|
|
|
|
|
defer func() {
|
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
|
log.Error("Unzip:", r)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
zipReader, err := zip.OpenReader(zipFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Println("打开文件失败:" + err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
//defer的使用规则:1.当defer被声明时,其参数就会被实时解析;2.defer执行顺序为先进后出;3. defer可以读取有名返回值
|
|
|
|
|
defer zipReader.Close()
|
|
|
|
|
for _, f := range zipReader.File {
|
|
|
|
|
fpath := filepath.Join(destDir, f.Name)
|
|
|
|
|
if f.FileInfo().IsDir() {
|
|
|
|
|
os.MkdirAll(fpath, os.ModePerm)
|
|
|
|
|
} else {
|
|
|
|
|
if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
|
|
|
|
|
log.Println("创建文件夹失败:" + err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
inFile, err := f.Open()
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Println("文件打开失败:" + err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer inFile.Close()
|
|
|
|
|
outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Println("复制错误:" + err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer outFile.Close()
|
|
|
|
|
_, err = io.Copy(outFile, inFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Println("复制失败:" + err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
|
|
|
|
|
defer func() {
|
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
|
log.Error("init:", r)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
logFile, err := os.OpenFile("log.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
log.SetOutput(logFile)
|
|
|
|
|
// log.SetPrefix("[update]")
|
|
|
|
|
}
|