Winform小工具的自动更新功能实现


前言

自制的Winform小工具,不到1MB,局域网内多人使用。
在功能更新/修复bug时,如果挨个发新包,显得过于愚蠢。
所以制作了自动更新功能。
说白了就是自动执行【下载最新版,替换,打开】这套流程。

注意:大概率是取巧方式,只是凑巧能用


一、思路

  • 1、程序发布时,
    • 1.1、包名和版本号就已经确定了(写在代码里-_-||)。
    • 1.2、上传到更新服务器中,我这里用的是FTP,然后用TXT记录包名和对应的最新版本号。
  • 2、程序运行,
    • 2.1、获取当前程序进程id,用于后续更新时KILL。
    • 2.2、去FTP下载TXT,比对版本。
  • 3、点击更新,
    • 3.1、下载最新的EXE到TEMP,Path.GetTempFileName()
    • 3.2、运行cmd,执行:关闭自己,移动并覆盖文件,重新打开。
  • 完成更新。

之所以这么做,主要的一点,小工具的发布模式是单个文件
常理来说,应该是另外有个update.exe,需要更新时去启动它。
我这里相当于用cmd.exe 代替了update.exe的工作。

二、功能实现

&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面
&&,表示必须前一个命令执行成功才会执行后面的命令
||,表示必须前一个命令执行失败才会执行后面的命令
|,表示前一个命令输出结果作为后一个命令的参数使用
/C,执行字符串指定的命令,然后终止

string[] cmds = new string[]
{
    $"taskkill /pid {processId} /f&&",// /f 指定强制结束进程。成功继续
    $"timeout /t 2&",//等个2秒
    $"tasklist | findstr \"{processId}\"||",//找不到才继续
    $"move /y {sourcesFileName} {destFileName}&&",// /y 不提示覆盖。成功继续
    $"start {destFileName}&",
    $"timeout /t 3",//等个3秒,然后结束
};

Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = @$"/C {string.Join("", cmds)}";
p.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动
p.StartInfo.CreateNoWindow = false;//显示程序窗口
p.Start();//启动程序
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值