当前位置: 首页 > news >正文

基于FTP模式更新Winform程序

项目背景

公司开发了Winform程序装了几十台设备,手工更新非常麻烦,为了方便程序更新,自己开发了一个基于ftp的自动更新插件,可以设置版本,启动程序,更新时间,下面就是效果图。

 项目使用

把Update.exe和UpdateConfig.xml文件放到你的程序目录然后根据你项目的需求编写xml配置文件

 

<?xml version="1.0" encoding="utf-8" ?>
<configs>
  <config name="version" value="1.02" />
  <config name="ftpUrl" value="127.0.0.1/Update/DyePlanQuery/Current" />
  <config name="exclude" value="WinFormsApp.exe.config,WinFormsApp.vshost.exe.config" />
  <config name="runApp" value="WinFormsApp.exe" />
  <config name="clearApp" value="WinFormsApp.exe" />
</configs>

vesrion是版本号,ftpUrl是你服务器FTP的路径,我是基于IIS搭建的FTP

 服务器也有个UpdateConfig.xml,程序会根据客户端和服务器的xml比对来更新程序。

 runApp配置之后可以再更新完之后自动启动应用程序,配置的是应用程序exe的名称

工程介绍

工程包含了ConfigHelper,FTPClient,Tools三个主要实现类

ConfigHelper主要功能是读取XML配置文件

 

FTPClient主要功能是和服务器FTP通讯

 

 Tools包含了一些公共的方法

 项目中使用

首先把update.exe引入工程

using BrickDogUpdate = Update;

在项目中添加定时器,设置自己想要更新的时间点,如果服务器有更新就会关闭当前程序启动更新程序,更新完毕会再次启动程序。

private void timer1_Tick(object sender, EventArgs e)
{
    //更新 23:59:59 11:59:59
    if (DateTime.Now.ToString("HH:mm:ss") == "23:59:59" || DateTime.Now.ToString("HH:mm:ss") == "11:59:59")
    {
        //加载配置文件
        BrickDogUpdate.ConfigHelper.Load();
        BrickDogUpdate.FTPClient fTPClient = new Update.FTPClient(BrickDogUpdate.ConfigHelper.config.ftpUrl);
        //与FTP服务器比较版本号是否需要更新
        if (fTPClient.IsNeedUpdate())
        {
            Start_Update_Thread();
            Application.Exit();
        }
    }
}

void Start_Update_Thread()
{
    System.Threading.Thread oThread = new System.Threading.Thread(new System.Threading.ThreadStart(Update_Thread));
    oThread.Start();
}

void Update_Thread()
{
    string updateUrl = System.IO.Directory.GetCurrentDirectory() + "\\Update.exe";
    Process.Start(updateUrl);
}

其他

.vshost的进程会导致进程关闭不彻底,我们如下配置。

在调试页面,改成release,同时取消最后一项启用承载进程

 在生成页面,将高级选项中的调试信息改成none可以取消生成pdb文件

 

相关文章:

  • 金仓数据库 KingbaseES 插件参考手册 T(2)
  • LeetCode每日一题JAVA、JavaSrcipt题解——2022.08.11-08.20
  • java面向对象思维程序设计开发以及案例 -电梯运行问题对象分析与程序设计(2)
  • 有限元和神经网络结合,人脑神经网络和宇宙
  • 手写一个二叉搜索树(BST)
  • 高通WLAN框架学习(36)-- ACS(Auto Channel Selection)自动信道选择
  • 程序流程控制(Java)
  • 分布式事务seata入门
  • 深度神经网络训练
  • 盒模型小知识点
  • Hbase-9-HBase操作-过滤器
  • matlab gui编程教程,matlab如何使用gui
  • win10如何禁止CDR软件访问网络的设置方法教程
  • u2 尚硅谷--Vue 脚手架
  • STM32使用库函数点灯实验
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 2019.2.20 c++ 知识梳理
  • docker-consul
  • java 多线程基础, 我觉得还是有必要看看的
  • Java应用性能调优
  • Rancher-k8s加速安装文档
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • vue总结
  • XForms - 更强大的Form
  • 阿里云应用高可用服务公测发布
  • 分布式事物理论与实践
  • 高度不固定时垂直居中
  • 给Prometheus造假数据的方法
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 模型微调
  • 小程序开发中的那些坑
  • 一道闭包题引发的思考
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #Linux(帮助手册)
  • (1)SpringCloud 整合Python
  • (C语言)字符分类函数
  • (pojstep1.1.2)2654(直叙式模拟)
  • (实战篇)如何缓存数据
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • @Controller和@RestController的区别?
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [BIZ] - 1.金融交易系统特点
  • [bug总结]: Feign调用GET请求找不到请求体实体类
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [C++]18:set和map的使用
  • [codeforces]Levko and Permutation
  • [Dxperience.8.*]报表预览控件PrintControl设置
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)
  • [IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式
  • [Java][Android][Process] ProcessBuilder与Runtime差别
  • [LeetCode 687]最长同值路径
  • [leetcode]Clone Graph
  • [oeasy]python0004_游乐场_和python一起玩耍_python解释器_数学运算