package utils import ( "archive/zip" "errors" "fmt" "io" "os" "path/filepath" ) // 解压文件 func Unzip(src string) error { err := unzipFile(src, unzipTmp) if err != nil { fmt.Println("解压失败:", err) // 删除临时文件 os.RemoveAll(unzipTmp) os.Remove(src) return errors.New("解压失败") } // 替换新旧文件 os.RemoveAll(appPath) os.Rename(unzipTmp, appPath) // 删除下载的压缩文件 os.Remove(src) // fmt.Println("解压成功!") return nil } func unzipFile(zipFile, destDir string) error { r, err := zip.OpenReader(zipFile) if err != nil { return err } defer r.Close() for _, f := range r.File { // 构建解压后的文件路径 filePath := filepath.Join(destDir, f.Name) if f.FileInfo().IsDir() { // 创建目录 os.MkdirAll(filePath, os.ModePerm) continue } // 创建父目录 os.MkdirAll(filepath.Dir(filePath), os.ModePerm) // 打开zip文件中的文件 rc, err := f.Open() if err != nil { return err } defer rc.Close() // 创建解压后的文件 outFile, err := os.Create(filePath) if err != nil { return err } defer outFile.Close() // 将zip文件中的内容复制到解压后的文件中 _, err = io.Copy(outFile, rc) if err != nil { return err } } return nil }