实现思路:通过访问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. 分页(pagination)样式表

    ul { list-style: none; padding:; margin:; } .pagination{ display:inline-block; padding-left:; border ...

  2. java 第三周作业

    1.P132分析: long before = System.currentTimeMillis(); //返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1 ...

  3. 服务器搭建lamp环境

    使用的例子:服务器版本内核centos 7.04     Xshell连接到您的服务器上,使系统处于最新状态执行以下命令, yum update -y     利用yum命令安装Apache执行命令, ...

  4. VUE处理 组件赋值 watch 监听不到赋值问题

    开发中,遇到了一个BUG,做的页面类似于 导航切换效果.两个组件传值. 上方导航组件   (主动) 左侧导航组件   (被动) 点击上方导航,左侧导航实现变换对应的栏目. 实现过程中,遇到了点问题.左 ...

  5. String与StringBuffer之间的转换

    来源:http://www.oschina.net/code/snippet_2261089_47352 package demo; /* String与StringBuffer之间的转换 * Str ...

  6. c#错误cs0006

    生成解决方案时报“error CS0006: Metadata file '.../.../.../xxx.dll'could not be found". 错误列表-下拉框选择整个解决方案 ...

  7. jasperreports+IReport 5.56,集成到Spring MVC4.0案例

    首先,先说一下需求,项目需要打印一些报表,也没多想,直接就在jsp页面设置了样式,前台直接调用window.print()写了打印功能,但是例会的时候,领导提出需要一些比较麻烦的打印,自己写肯定费时间 ...

  8. keras图像风格迁移

    风格迁移: 在内容上尽量与基准图像保持一致,在风格上尽量与风格图像保持一致. 1. 使用预训练的VGG19网络提取特征 2. 损失函数之一是"内容损失"(content loss) ...

  9. Django 1.9 + celery + django-celry 实现定时任务

    celery可以进行任务异步处理,celery还有一种Celery的常用模式便是执行定期任务. 执行定期任务时, Celery会通过celerybeat进程来完成. Celerybeat会保持运行, ...

  10. s21day22 python笔记

    s21day22 python笔记 一.内容回顾及补充 模块补充 importlib.import_module:通过字符串的形式导入模块 #示例一: import importlib # 用字符串的 ...