• 一种软件升级程序updata的 构造思路


    目录

    序 、整体思路

    一 、 主程序工作

    1、下载zip包,并记录相关信息

    2、将xnwlive/updateVer.exe 解压到 系统下载目录

    3、关闭主程序,运行这个升级程序

    二、运行更新程序,解压zip包

    1、获得appdata下,保存的更新信息 appPath

    2、将zip包解压到AppPath中


    序 、整体思路

    这是我实际中使用的一种更新思路,整体思路如下:

    1)、主程序负责下载更新包、并记录路径,及解压updata.exe程序

    主程序负责下载更新包,下载到系统download目录下,并解压其中的updata.exe 也是解压在系统download目录下,主程序,下载更新包时,将更新包的版本信息,以及主程序路径,存放在系统%appdata%中。

    之所以下载到系统download下,主要是考虑,若是安装在无写权限路径时,最起码系统download是可写的。

    2)、更新程序updata.exe负责将zip包解压到 主程序目录下

    一 、 主程序工作

    1、下载zip包,并记录相关信息

          将本程序路径 记录在APPDATA中

    1. cef_control_->AttachUpdateXnwVerCallback([](){
    2. //更新的包 下载到 系统downloads\xnw下,
    3. std::wstring xnwDownloadPath = GetXnwAppdataOrthersetPathW(); //保存到系统 Ortherset下
    4. WriteIniFileW(L"Ver", L"AppPath", appFolderW+L"\\", xnwDownloadPath);
    5. }); //有此回调 则说明 下载文件时,不需要跳出选择对话框来

    下载到系统downloads目录下

    2、将xnwlive/updateVer.exe 解压到 系统下载目录

    1. std::wstring zipDir = GetXnwSysMyDownloadDirW() + L"\\";
    2. SetCurrentDirectoryW(zipDir.c_str());
    3. HZIP hz = OpenZip(m_zipFile.c_str(), "");
    4. if (hz != NULL)
    5. {
    6. ZIPENTRY ze;
    7. GetZipItem(hz, -1, &ze);
    8. int numitems = ze.index;
    9. int nFindItemIndex = 0;
    10. FindZipItem(hz, L"xnwlive/updateVer.exe", false, &nFindItemIndex, &ze);
    11. if (nFindItemIndex != -1)
    12. {
    13. UnzipItem(hz, nFindItemIndex, ze.name);
    14. }
    15. CloseZip(hz);
    16. }

    3、关闭主程序,运行这个升级程序

    1. std::wstring exefilePath = zipDir;
    2. exefilePath.append(L"xnwlive/updateVer.exe");
    3. SHELLEXECUTEINFO shExInfo = { 0 };
    4. shExInfo.cbSize = sizeof(shExInfo);
    5. shExInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    6. shExInfo.hwnd = 0;
    7. shExInfo.lpVerb = _T("runas"); // Operation to perform
    8. shExInfo.lpFile = exefilePath.c_str(); // Application to start
    9. shExInfo.lpParameters = L""; // Additional parameters
    10. shExInfo.lpDirectory = 0;
    11. shExInfo.nShow = SW_SHOW;
    12. shExInfo.hInstApp = 0;
    13. if (ShellExecuteEx(&shExInfo))
    14. {
    15. CloseBtn(false); //关闭主程序
    16. WaitForSingleObject(shExInfo.hProcess, INFINITE);
    17. CloseHandle(shExInfo.hProcess);
    18. }

    二、运行更新程序,解压zip包

    1、获得appdata下,保存的更新信息 appPath

    1. std::wstring dir;
    2. GetPrivateProfileString(L"Ver", L"AppPath", NULL, szPathW, 255, iniFile.c_str());
    3. if (wcslen(szPathW) > 0)
    4. {
    5. dir = szPathW; //客户端路径
    6. }

    2、将zip包解压到AppPath中

    1. SetCurrentDirectoryW(zipDir.c_str());
    2. HZIP hz = OpenZip(path.c_str(), "");
    3. ZIPENTRY ze;
    4. GetZipItem(hz, -1, &ze);
    5. int numitems = ze.index;
    6. std::wstring name;
    7. for (int i = 0; i < numitems; i++)
    8. {
    9. GetZipItem(hz, i, &ze);
    10. name = ze.name;
    11. std::wstring zipName;//去除 xnwlive/ 直接装在现有目录下
    12. std::wstring xnwliveS = L"xnwlive/";
    13. zipName = name.substr(xnwliveS.length());
    14. UnzipItem(hz, i, zipName.c_str());
    15. }
    16. CloseZip(hz);

  • 相关阅读:
    04、添加 com.fasterxml.jackson.dataformat -- jackson-dataformat-xml 依赖报错
    sql语句中查重复数据
    spring框架漏洞整理
    算法题: 221. 最大正方形
    如何通过Appium连接真机调试
    (PC+WAP)织梦模板娱乐新闻资讯类网站
    在R中通过正则化表达式提取向量中的正负数
    如何做好软件本地化翻译服务
    SQL基础知识(一)
    接雨水问题
  • 原文地址:https://blog.csdn.net/shuilan0066/article/details/126319799