C# Winform 中使用FTP实现软件自动更新功能
实现思路:通过访问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实现软件自动更新功能的更多相关文章
- Android 软件自动更新功能实现的方法
相信所有的用户都遇到过软件提醒更新的情况,下面就将实现此功能 首先看一下程序目录结构 步骤: 1.新建一个类UpdateManger,用于显示提示更新 详细出处参考:http://www.jb51.n ...
- WinForm应用程序中实现自动更新功能
WinForm应用程序中实现自动更新功能 编写人:左丘文 2015-4-20 近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因 ...
- Android - 软件自动更新的实现
转自:http://blog.csdn.net/wwj_748/article/details/8195565 接触到一个很实用的技术,那就是软件自动更新.一般开发者是通过自行在应用平台添加更新版本的 ...
- Android应用自动更新功能的实现!!!
自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语:最新版本的url等).然后我们给出提示框,用 ...
- Android实现自动更新功能
Android实现自动更新功能 Android自动更新的功能可以使用第三方的SDK来实现,但是类似友盟,就不支持x86手机的自动更新,科大讯飞,弹窗是全局的,小米手机就会默认把弹窗权限关掉不允许弹出提 ...
- Android应用自动更新功能的实现!
Android应用自动更新功能的实现!http://blog.csdn.net/android_tutor/article/details/7015986 private static final i ...
- .net winform软件自动更新
转载自 http://dotnet.chinaitlab.com/DotNetFramework/914178.html 关于.NET windows软件实现自动更新,本人今天写了一个DEMO,供大家 ...
- Winform中TextBox控件开启自动提示补全功能
问题:Winform开发中,有一个TextBox控件用以输入姓名,现希望在输入名字时能够自动提示所有可能的名字. 解答:winform中的TextBox控件含有如下三个属性: ① AutoComp ...
- 如何屏蔽 iOS 软件自动更新,去除更新通知和标记
适用于 iOS.iPadOS 和 watchOS,即 iPhone.iPad 和 Apple Watch 通用. 请访问原文链接:https://sysin.org/article/Disable-i ...
随机推荐
- PHP类自动加载技术
在我们平时用框架比如laravel时,只要在app目录下的任意路基文件中,如下使用就可以实例化一个对象. $u = new App\Model\User() 我们知道,原生PHP要想实例化一个其他文件 ...
- jdk环境变量配置改变不生效的问题
在工作中两次遇到jdk配置上的这个问题:将环境变量中的jdk路径修改之后,使用-version查看,版本号还是之前的,也就是说修改未生效.甚至当我将Path变量中的jdk路径配置都删除了之后,使用-v ...
- flock
为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成串行状态.作为锁机制中的一种,PHP的文件锁也是为了应对资源竞争.假设一个应用场景,在存在较大并发的情况下,通过fwrite向文件尾部多次有 ...
- python写mapReduce初步
最近在学了python了,从mapReduce开始 ,话不多说了,直接上代码了哈 map阶段,map.py文件 import sys # 标准输入 # 在终端的话,就需要这样了 cat a.txt | ...
- Element-ui 更新tableData 中 row的某一个属性时,没有更新视图的问题
在一个报警音管理的页面中,每次点击试听的时候,需要把‘试听’ 更新为 ‘停止’, 起初我们给row.play=0时,显示为 试听,row.play=1时显示为停止, 但是在代码中每次为row.play ...
- NodeJs 设置跨域后页面全部变成了源码在浏览器上显示
百度搜索跨域后得到 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin" ...
- Java中8种常见的排序方法
排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少 ...
- 【oacle入门】表空间类型
系统表空间 系统表空间包括SYSTEM和SYSAUX表空间,系统表空间是所有数据库必须且自动创建的,一般存放在Oracle的数据字典表及相应数据. 永久表空间 永久表空间用户保存永久性数据,如系统数据 ...
- flashback_scn导出
1.应用场景2.oracle实现该技术的原理理论,及限制3.实操及与scn时间相关的函数查询 一.flashback_scn导出1) OGG同步,对表的数据进行同步,第一次可以完全导出,中途如果由于某 ...
- Docker CE安装
#添加账户docker useradd docker passwd docker (密码docker) #设置sudo权限 visudo root ALL=(ALL) ALL 后添加一行: docke ...