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