实现思路:通过访问FTP站点,将站点中的文件下载至软件指定位置。

第一步:FTP站点中导入需要下载更新的程序文件,并添加配置文件(配置下载后文件的下载路径),如下图所示:

第二步:Winfrom程序读取FTP站点服务下载配置文件,解析需要下载的文件列表

第三步:循环下载更新程序文件,下载至指定位置即可

IIS中创建FTP站点略(测试访问如下图)

具体实现可参考如下所示代码:

FTP下载操作方法:

 /// <summary>
/// 从ftp服务器上下载文件的功能
/// </summary>
/// <param name="fileName">文件名称</param>
public void Download(string fileName)
{
FtpWebRequest reqFTP;
try
{
string filePath = Application.StartupPath;
FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
string str=FTPFilePath + ":" + FtpServerPort + "/" + fileName;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(str));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
reqFTP.UsePassive = false;
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();
}
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// 从ftp服务器上下载文件的功能
/// </summary>
/// <param name="fileName">文件名称</param>
/// <param name="targetPath">存放目标位置+文件名称</param>
public void Download(string fileName,string targetPath)
{
FtpWebRequest reqFTP;
try
{
string filePath = Application.StartupPath;
//FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
FileStream outputStream = new FileStream(targetPath, FileMode.Create);
string str = FTPFilePath + ":" + FtpServerPort + "/" + fileName;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(str));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(FtpServerUserName, FtpServerPassword);
reqFTP.UsePassive = false;
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();
}
catch (Exception ex)
{
throw ex;
}
}

  

XML解析方法:

using System.Collections.Generic;
using System.Xml; namespace AutoUpdate
{
/// <summary>
/// 用于XML操作
/// </summary>
public class XmlHelper
{
private static XmlHelper instance;
public static XmlHelper Instance
{
get
{
if (instance == null) instance = new XmlHelper();
return XmlHelper.instance;
}
} /// <summary>
/// 获取指定节点所有子节点相关属性
/// </summary>
/// <param name="path">文件路径</param>
/// <param name="nodePath">节点路径</param>
/// <returns>List<UpdateList></returns>
public List<UpdateList> GetUpdateList(string path, string selectNode)
{
XmlDocument doc = new XmlDocument();
doc.Load(path);
XmlNode node = doc.SelectSingleNode(selectNode);
List<UpdateList> list = new List<UpdateList>();
foreach (XmlNode item in node)
{
UpdateList config = new UpdateList();
config.NAME = item.Attributes["NAME"].Value;
config.PATH = item.Attributes["PATH"].Value; list.Add(config);
}
return list;
} } /// <summary>
/// config.xml item节点属性描述
/// </summary>
public class UpdateList
{
public string PATH { get; set; }
public string NAME { get; set; }
}
} 

测试调用:

private void btnUpdate_Click(object sender, EventArgs e)
{
//第一步下载需要更新的配置文件
string filepath = "UpdateList.xml";
UpdateHelper.Instance.Download(filepath);
//第二步 提供并解析配置文件(获取需要更新的文件名称、文件更新后的路径)
string path = Application.StartupPath + "\\UpdateList.xml";
List<UpdateList> list = XmlHelper.Instance.GetUpdateList(path, "Root");
//第三步 循环下载文件到指定路径
foreach (UpdateList item in list)
{
if (string.IsNullOrEmpty(item.PATH)) UpdateHelper.Instance.Download(item.NAME);//下载至根目录
else //下载至指定目录
{
string targetPath = Application.StartupPath + "\\" + item.PATH + "\\" + item.NAME;
UpdateHelper.Instance.Download(item.NAME, targetPath);
}
}
MessageBox.Show("更新成功");
}

  

C# Winform 中使用FTP实现软件自动更新功能的更多相关文章

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

    相信所有的用户都遇到过软件提醒更新的情况,下面就将实现此功能 首先看一下程序目录结构 步骤: 1.新建一个类UpdateManger,用于显示提示更新 详细出处参考:http://www.jb51.n ...

  2. WinForm应用程序中实现自动更新功能

    WinForm应用程序中实现自动更新功能 编写人:左丘文 2015-4-20 近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因 ...

  3. Android - 软件自动更新的实现

    转自:http://blog.csdn.net/wwj_748/article/details/8195565 接触到一个很实用的技术,那就是软件自动更新.一般开发者是通过自行在应用平台添加更新版本的 ...

  4. Android应用自动更新功能的实现!!!

    自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语:最新版本的url等).然后我们给出提示框,用 ...

  5. Android实现自动更新功能

    Android实现自动更新功能 Android自动更新的功能可以使用第三方的SDK来实现,但是类似友盟,就不支持x86手机的自动更新,科大讯飞,弹窗是全局的,小米手机就会默认把弹窗权限关掉不允许弹出提 ...

  6. Android应用自动更新功能的实现!

    Android应用自动更新功能的实现!http://blog.csdn.net/android_tutor/article/details/7015986 private static final i ...

  7. .net winform软件自动更新

    转载自 http://dotnet.chinaitlab.com/DotNetFramework/914178.html 关于.NET windows软件实现自动更新,本人今天写了一个DEMO,供大家 ...

  8. Winform中TextBox控件开启自动提示补全功能

    问题:Winform开发中,有一个TextBox控件用以输入姓名,现希望在输入名字时能够自动提示所有可能的名字. 解答:winform中的TextBox控件含有如下三个属性:   ① AutoComp ...

  9. 如何屏蔽 iOS 软件自动更新,去除更新通知和标记

    适用于 iOS.iPadOS 和 watchOS,即 iPhone.iPad 和 Apple Watch 通用. 请访问原文链接:https://sysin.org/article/Disable-i ...

随机推荐

  1. python并发_线程

    关于进程的复习: # 管道 # 数据的共享 Manager dict list # 进程池 # cpu个数+1 # ret = map(func,iterable) # 异步 自带close和join ...

  2. IP通信基础课堂笔记----第二章(重点)

    TCP报文及传输 TCP报文主要学习的内容包括,报文格式.连接管理.流量控制.差错控制. TCP报文是由报文头部和数据两个部分组成.占20字节的报文头部包括源端口.位目的端口.序号..确认号.首部长度 ...

  3. 石头的Xcode学习列表

    http://www.cnblogs.com/JangoJing/tag/xcode/

  4. 【原创】Arduino入门基础知识总结

     一.概述   Arduino是源自意大利的一个开放源代码的硬件项目平台,该平台包括一块具备简单I/O功能的电路板以及一套程序开发环境软件. Arduino可以用来开发交互产品,比如它可以读取大量的开 ...

  5. ArrayList、LinkedList和vector的区别

    1.ArrayList和Vector都是数组存储,插入数据涉及到数组元素移动等操作,所以比较慢,因为有下标,所以查找起来非常的快. LinkedList是双向链表存储,插入时只需要记录本项的前后项,查 ...

  6. 玩转BLE(1)_Eddystone beacon

    1. 前言 你相信两条命令就可以把自己的破手机变成一个Beacon节点吗?不相信的话就接着往下看吧. 通过前几篇“蓝牙协议分析”相关的文章,特别是“蓝牙协议分析(3)_蓝牙低功耗(BLE)协议栈介绍” ...

  7. Ricker wavelet 简介

    本文依照参考文献简介 Ricker wavelet . 参考: [1] Frequency of the Ricker wavelet DOI: 10.1190/GEO2014-0441.1 [2] ...

  8. Oracle12c的安装

    直接下一步不多说高级安装可以选择设置,嫌麻烦可以直接典型安装(少些设置步骤)这里随便命用户名,口令即密码此处可以改安装路径可以根据电脑自身配置更改,但建议高于20%(给的越少,Oracle运行速度越慢 ...

  9. 【leetcode】461. Hamming Distance

    problem 461. Hamming Distance solution1: 根据题意,所求汉明距离指的是两个数字的二进制对应位不同的个数.对应位异或操作为1的累积和. class Solutio ...

  10. Mysql数据库账户权限设置

    1.修改mysql数据库的root密码: 修改 数据库.表名 SET password=加密(‘密码’) where user=’root’; UPDATE mysql.user SET passwo ...