You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
1.7 KiB
Go

4 weeks ago
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]")
}