我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Winform使用FTP实现自动更新

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Winform使用FTP实现自动更新

本文实例为大家分享了Winform使用FTP实现自动更新的具体代码,供大家参考,具体内容如下

实现思路:在主程序打开前实现判断是否需要更新(可以通过数据库表记录一下版本号或者别的方式记录是否需要更新),若需要更新时从ftp站点下载更新包(关于配置ftp站点自己可以搜这里不再做详述)。自己可以制定后缀格式的包或者别的!一般用压缩包的形式来存放最新程序,将文件下载到本地路径,在关闭当前程序打开更新程序做解压替换文件操作,或者可以用批处理文、可执行文件来做操作都行!

1.判断是否有新版本。

2.通过ftp将更新包下载至本地路径。

3.打开更新程序(批处理文件或可执行文件)同时关闭所有主程序进程。

4.在更新程序中进行解压、替换操作。

5.待替换完毕删除本地更新包(可选)。

6.打开新程序同时关闭所有更新程序进程。

代码:

1.在程序入口处Program.cs中做判断:

//判断版本号是否为数据库表的版本号
  if (edition == "2021.5.12.0.1")//版本号自己可以判断
            {
                var resulta = MessageBox.Show("有可用更新,是否更新?", "系统提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (resulta == DialogResult.No)
                {
                    Application.Run(new Form1());
                    return;
                }
               
                //从服务器获取新压缩文件后下载至某一路径
                UpdatateHelp help = new UpdatateHelp();//更新类
                help.IP = "xxx.xx.xx.xxx";
                help.ServerFile = "OldDemoUpd.zip";
                help.User = "Administrator";
                help.Password = "*****";
                string message = string.Empty;
                if (!help.DownloadFile(out message))
                {
                    var result = MessageBox.Show(message, "系统提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    if (result == DialogResult.Yes)
                    {
                        Application.Run(new Form1());
                        return;
                    }
                    else
                    {
                        //强制关闭进程    
                        var proc = System.Diagnostics.Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
                        foreach (Process item in proc)
                        {
                            item.Kill();
                        }
                    }
                }
                //替换程序文件(用一个update程序负责解压程序并替换文件,在删除压缩文件)
                System.Diagnostics.Process.Start(Application.StartupPath + "\\Update\\" + "AutoUpdate.exe");
                //关闭当前进程   
                foreach (Process item in System.Diagnostics.Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName))
                {
                    item.Kill();
                }
            }

2.更新帮助类UpdatateHelp

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;

namespace OldDemo
{
    class UpdatateHelp
    {
        /// <summary>
        /// 服务器IP
        /// </summary>
        public string IP { get; set; }
        /// <summary>
        /// 服务器文件和下载到本地文件名一致
        /// </summary>
        public string ServerFile { get; set; }
        /// <summary>
        /// 服务器用户名
        /// </summary>
        public string User { get; set; }
        /// <summary>
        /// 服务器密码
        /// </summary>
        public string Password { get; set; }
        /// <summary>
        /// 下载服务器文件
        /// </summary>
        /// <param name="Message">返回信息</param>
        /// <returns></returns>
        public bool DownloadFile(out string Message)
        {
            FtpWebRequest reqFTP;
            try
            {
                FileStream outputStream = new FileStream(Path.GetTempPath()+ ServerFile, FileMode.Create);//本地缓存目录
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + IP + "//"+ ServerFile));
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;//指定当前请求是什么命令(upload,download,filelist等)
                reqFTP.UseBinary = true;//指定文件传输的类型
                reqFTP.Credentials = new NetworkCredential(User, Password); //指定登录ftp服务器的用户名和密码。
                reqFTP.KeepAlive = false;//指定在请求完成之后是否关闭到 FTP 服务器的控制连接
                //reqFTP.UsePassive = true;//指定使用主动模式还是被动模式
                //reqFTP.Proxy = null;//设置不使用代理
                //reqFTP.Timeout = 3000;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                long cl = response.ContentLength;
                int bufferSize = 2048;
                int readCount;
                byte[] buffer = new byte[bufferSize];
                readCount = ftpStream.Read(buffer, 0, bufferSize);
                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }
                ftpStream.Close();
                outputStream.Close();
                response.Close();
                Message = "下载更新文件成功!";
                return true;
            }
            catch (Exception ex)
            {
                Message = "下载更新文件失败!原因:"+ex.Message + " 按是进入原程序,按否关闭程序!";
                return false;
            }
           
        }
    }
}

3.关闭主程序进程打开更新程序AutoUpdate.exe,可以在Program中执行也可以在程序中新建一个窗体显示进度条等!此处用Form1窗体来做解压处理,需要注意的地方是我引用了using Ionic.Zip;可以在Nuget下搜一下DotNetZip,该dll是针对文件解压缩帮助类,此只是例举解压,有兴趣自己研究别的实现!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Ionic.Zip;

namespace AutoUpdate
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();  
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            StartUpdate();
        }
        void StartUpdate()
        {
            string FileLoad = System.IO.Path.GetTempPath() + "OldDemoUpd.zip";
            string IndexLoad = Application.StartupPath + "\\";
            var lis = IndexLoad.Split('\\').ToList();
            lis.Remove("");
            lis.Remove("Update");//由于更新程序没和主程序目录同步,所以需要返回到Update文件夹上一级主程序目录中。
            IndexLoad = string.Join("\\",lis);
            //1.解压临时文件包到当前路径并删除压缩包
            if (System.IO.File.Exists(FileLoad))
            {
                label1.Text = "正在解压软件更新包...";
                //存在就解压
                if (!Decompression(FileLoad, IndexLoad, true))
                {
                    MessageBox.Show("解压更新包失败,请重试!", "系统提示");
                    //关闭当前进程   
                    foreach (System.Diagnostics.Process item in System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName))
                    {
                        item.Kill();
                    }
                }
                label1.Text = "正在删除软件更新包...";
                //删除压缩包
                System.IO.File.Delete(FileLoad);
            }
            else
            {
                MessageBox.Show("软件更新包不存在,请重新打开程序以获取更新包!", "系统提示");
                //关闭当前进程   
                foreach (System.Diagnostics.Process item in System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName))
                {
                    item.Kill();
                }
            }
            label1.Text = "更新成功,请稍后...";
            //2.打开更新后程序
            System.Diagnostics.Process.Start(IndexLoad + "\\" + "OldDemo.exe");
            //关闭当前进程   
            foreach (System.Diagnostics.Process item in System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName))
            {
                item.Kill();
            }
        }

        /// <summary>
        /// 解压ZIP文件
        /// </summary>
        /// <param name="strZipPath">待解压的ZIP文件</param>
        /// <param name="strUnZipPath">解压的目录</param>
        /// <param name="overWrite">是否覆盖</param>
        /// <returns>成功:true/失败:false</returns>
        public static bool Decompression(string strZipPath, string strUnZipPath, bool overWrite)
        {
            try
            {
                ReadOptions options = new ReadOptions();
                options.Encoding = Encoding.Default;//设置编码,解决解压文件时中文乱码
                using (ZipFile zip = ZipFile.Read(strZipPath, options))
                {
                    foreach (ZipEntry entry in zip)
                    {
                        if (string.IsNullOrEmpty(strUnZipPath))
                        {
                            strUnZipPath = strZipPath.Split('.').First();
                        }
                        if (overWrite)
                        {
                            entry.Extract(strUnZipPath, ExtractExistingFileAction.OverwriteSilently);//解压文件,如果已存在就覆盖
                        }
                        else
                        {
                            entry.Extract(strUnZipPath, ExtractExistingFileAction.DoNotOverwrite);//解压文件,如果已存在不覆盖
                        }
                    }
                    return true;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }
    }
}

4.需要注意的几个地方有:

4.1在主程序的生成目录下创建一个文件夹Update;

4.2把更新程序的生成文件放入Update文件夹下边,主要是主程序Program中这一段(主程序目录和更新目录不是同级):

//替换程序文件(用一个update程序负责解压程序并替换文件,在删除压缩文件)
 System.Diagnostics.Process.Start(Application.StartupPath + "\\Update\\" + "AutoUpdate.exe");

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Winform使用FTP实现自动更新

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解C#WinForm如何实现自动更新程序

在C/S这种模式中,自动更新程序就显得尤为重要,它不像B/S模式,直接发布到服务器上,浏览器点个刷新就可以了。本文就为大家准备了WinForm实现自动更新程序的示例代码,需要的可以参考一下
2022-11-13

C#WinForm实现自动更新程序的方法详解

这一篇就着重写一下客户端的代码,客户端主要实现的有:启动后检测本地的xml文件,然后发送到服务器获取需要更新的文件以及版本列表,感兴趣的小伙伴可以了解一下
2022-11-13

c# winform动态更新数据怎么实现

在C# WinForms中实现动态更新数据,可以使用数据绑定和事件处理来实现。使用数据绑定创建一个数据源,例如一个List或DataTable对象,用于存储数据。将数据源绑定到控件,例如DataGridView或ListBox。当数据
2023-10-26

C#WinForm实现自动更新程序之客户端的示例代码

这篇文章主要为大家详细介绍了利用C#WinForm实现自动更新程序之客户端的实现方法,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下
2022-11-13

Android如何实现APP自动更新

先来看看要实现的效果图:对于安卓用户来说,手机应用市场说满天飞可是一点都不夸张,比如小米,魅族,百度,360,机锋,应用宝等等,当我们想上线一款新版本APP时,先不说渠道打包的麻烦,单纯指上传APP到各大应用市场的工作量就已经很大了,好不容
2022-06-06

mysql 实现添加时间自动添加更新时间自动更新操作

在数据库使用中经常使用到时间字段。常用的有创建时间和更新时间。 然而在使用中想要创建时间在创建的时候自动设置为当前时间,更新时间在更新时自动更新为当前时间。 创建表 stuCREATE TABLE `stu` ( 'id' int NOT
2022-05-27

Android软件自动更新实现代码

如何实现软件自动更新,下面是具体实例: 效果图: 具体步骤: 1、在服务器上部署更新所用的xml文件:version.xml2baiduxinwen.apk
2022-06-06

Android应用自动更新功能实现的方法

本文给大家分享Android里应用版本更新功能这一块的实现。 一个好的应用软件都是需要好的维护,从初出版本到最后精品,这个过程需要版本不停的更新,那么如何让用户第一时间获取最新的应用安装包呢?那么就要求我们从第一个版本就要实现升级模块这一功
2022-06-06

Uniapp应用程序中如何实现自动更新

随着移动应用的快速发展,每天都有数百万的应用程序从各种应用商店推出。由于安全问题和漏洞,无法保障应用的运行稳定性。为了解决这些问题,开发人员必须经常更新他们的应用程序。这就是为什么我们要实现自动更新的原因之一。Uniapp是个多端的开发框架,开发者只需要编写一次代码,其就可以同时在多个平台上运行。这种跨平台的开发框架对开发者来说是相当有价值的。然而,当我们使用Uniapp开发应
2023-05-14

PostgreSQL如何实现自动更新时间戳

这篇文章主要介绍PostgreSQL如何实现自动更新时间戳,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是PostgreSQL时间戳数据类型?在PostgreSQL中,下一个数据类型是 TIMESTAMP ,它可
2023-06-21

使用c#怎么自动更新程序

使用c#怎么自动更新程序?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。主要功能介绍实现文件的自动更新。主要功能:支持整包完全更新,即客户端只需输入一个服务器地址,即可下载所有文
2023-06-14

Android应用APP自动更新功能的代码实现

由于Android项目开源所致,市面上出现了N多安卓软件市场。为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量。因此我们有必要给我们的Android应用增加自动更新
2022-06-06

PHPCMS使用date函数实现自动更新页脚年月的方法

可能大家光看标题不知道是什么意思,其实我也不知道得怎么下标题比较好,就是那个大部分网站都会用到的在底部的版权信息,例如复制代码代码如下:Copyright 2007-2015 &编程客栈copy; jb51.net® Inc. Al
2022-06-12

.Net Core如何配置与实现自动更新

这篇文章给大家分享的是有关.Net Core如何配置与实现自动更新的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。.Net Core 将之前Web.Config中的配置迁移到了appsettings.json文件中
2023-06-19

Linux系统如何实现自动更新时间

这篇文章主要介绍“Linux系统如何实现自动更新时间”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux系统如何实现自动更新时间”文章能帮助大家解决问题。安装NTP客户端 yum -y inst
2023-06-28

Vue实现自动检测以及版本的更新

当用户在当前站点停留时间比较长,中途站点进行升级更新之后,用户如果不刷新页面就任然停留在旧的页面里,如何让用户收到一个提示,引导用户进行更新操作呢?下面给大家介绍如何站点更新如何在生产环境提示用户更新,进行页面刷新操作,核心原理其实很简单
2023-05-14

Android 软件自动更新功能实现的方法

相信所有的用户都遇到过软件提醒更新的情况,下面就将实现此功能 首先看一下程序目录结构 步骤: 1、新建一个类UpdateManger,用于显示提示更新 代码如下:public class UpdateManger { // 应用程序C
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录