Csharp使用FTP实现客户端程序自动更新
- 格式:doc
- 大小:56.00 KB
- 文档页数:9
用PB实现C/S应用程序的自动升级黄石纺织机械厂信息中心黄新民 2007.9.5C/S模式的应用程序安装在客户端,一旦程序改动升级,更换应用程序的工作量大。
但由于它与B/S模式相比具有交互能力强、运行速度快的优点,目前在企业管理内部的ERP等应用中还是得到比较广泛的应用。
企业的信息化是一个长期的、不断进步的过程,所以应用程序的修改和升级也是经常发生的。
目前企业的信息化应用都达到一定的规模,客户端的数量至少也在几十台以上。
一旦对应用程序进行修改,及时地更换客户端应用程序的工作量是很大的。
怎样在C/S模式下实现应用程序的自动升级呢?下面介绍一种PB开发的应用程序实现自动升级的方法。
自动升级的核心是在应用程序的启动程序段加入判别版本信息的代码,版本有效就直接进入应用系统,否则进行升级。
实现这种自动升级的过程比较简单:1.将当前应用程序变为过时的旧版在数据库中建立一个版本信息表bbxx,表的结构包含系统名(xtname)和版本号(bbh)两个字段,例如序记录的版本号信息进行比较,若相同则正式运行应用程序;不同则进行版本的自动更新。
采用这种方法的优点是能及时地停止所有客户端旧版应用程序的运行,从而保证不会出现由于旧版更换不及时而造成的数据混乱。
2.确定当前应用程序所在的位置应用程序在客户端安装的位置可能各不相同,确定其在客户端的安装位置才能保证新程序的正确替换。
3.自动建立网络资源,连接网络内新版应用程序所在的目录,拷贝新文件在网络内确定一台计算机,并设定一个放置新版pbd文件的共享文件夹。
在应用程序应用的Open事件中编写代码,建立网络资源,连接到共享文件夹,复制新文件。
4.断开网络资源5.重新登陆进入新版应用程序在PB中实现上述过程的详细步骤:1.声明外部函数FUNCTION Long WNetAddConnection2 ( REF NETRESOURCE lpNetResource, String lpPassword, String lpUserName, Long dwFlags) LIBRARY "mpr.dll" ALIAS FOR "WNetAddConnection2A" FUNCTION Long WNetCancelConnection2 (String lpName, Long dwFlags,Long fForce) LIBRARY "mpr.dll" ALIAS FOR "WNetCancelConnection2A"2. 建立结构3.// 建立与数据库的连接-------------……connect USING SQLCA;if sqlca.sqlcode <> 0 thenmessagebox('提示', '不能连接数据库!')haltend if// ----------------------------------------string bbh1select bbh into :bbh1 from hsfj.bbxx where xtname = '采购管理'; //得到当前有效的版本号if bbh1='2007.9.2A' then // 每次修改结束编译新的可执行文件前,将数据库的版本信息表的版本号字段改为新值,同时修改此处引号内的值与其一致。
客户端版本怎么更新在软件开发中,客户端版本更新是至关重要的。
随着技术的不断发展和用户需求的变化,软件开发商必须定期提供新的版本来修复漏洞、改进功能和提供更好的用户体验。
在本文中,我们将探讨客户端版本更新的一些常见方法和最佳实践。
一、自动更新自动更新是客户端版本更新的一种常见方法。
通过自动更新,软件开发商可以向用户提供新版本的软件,并在用户启动客户端时自动下载和安装更新。
自动更新可以让软件开发商更加方便地推送新的版本,并确保用户始终使用最新版本的软件。
自动更新的实现方法有很多种。
一种常用的方法是使用在线更新服务。
软件开发商可以将更新文件发布到在线服务器上,并在客户端启动时检查服务器上是否有新的版本可供下载。
如果有新的版本可用,客户端将自动下载并安装更新。
这种方法需要软件开发商在云端维护一个更新服务器,并确保服务器的稳定和可靠性。
另一种常用的自动更新方法是使用内置的更新机制。
这种方法通常在客户端中嵌入一个更新模块,该模块负责检查是否有新的版本可供下载,并在需要时下载和安装更新。
这种方法相对于在线更新服务更加灵活,因为它不依赖于外部服务器,可以更好地适应各种网络环境。
二、手动更新除了自动更新外,手动更新也是一种常见的客户端版本更新方法。
手动更新通常需要用户主动下载更新文件,然后手动安装更新。
这种更新方法通常适用于一些对网络连接要求较高的软件,比如在线游戏或大型应用程序。
手动更新的实施方法也有很多种。
软件开发商可以直接在官方网站上提供新版本的下载链接,用户可以根据需要手动下载并安装更新。
另一种方法是通过邮件或系统通知向用户发送更新提醒,并包含下载链接和安装指南。
无论采用哪种方法,手动更新需要软件开发商提供明确的更新说明和清晰的安装指南,以帮助用户顺利完成更新过程。
三、更新注意事项无论是自动更新还是手动更新,客户端版本更新都需要注意以下几点:1. 稳定性和可靠性:更新过程应该尽可能稳定和可靠,以避免更新过程中出现错误或意外导致用户数据丢失或软件崩溃。
本文以小型应用的通用性自动更新程序,开发的程序可以直接拿过来使用,非常方便。
原理服务器端的结构是这样的:其工作原理如下:Update.asmx仅提供一个功能,就是检测是否需要更新,在需要更新的时候就返回一个更新地址,通常情况下返回的地址就是Download.ashx,而在某些特殊情况下,也可以修改服务端使之从其他Url提供更新下载。
检测是否需要更新的的具体做法是:首先获取Updata目录中的主程序版本号,再获取数据库中的最新版本号,两者对比。
如果相同则直接与客户端提供的版本号相对比并返回结果;如果不同则将主程序版本号写入数据库,然后生成新的更新文件包,直接向客户端返回更新地址。
Download.ashx的功能仅仅是将最新版本更新文件包输出。
而客户端部分包含主程序、Update.exe以及其他附属文件,更新时由主程序检测并下载更新,在主程序退出时,如有更新并已成功下载,则调用Update.exe完成解包及更新覆盖工作。
需注意的是:Update.exe永远不能被更新,因为它无法更新其自身,所以服务端更新时也不要将Update.exe纳入更新包。
下面就是来实际编写一个自动更新解决方案:服务器端首先建立一个Web服务项目,项目名为“自动更新服务”:添加一数据库,名为Database.mdf:在数据库中创建新的数据库关系图,并如下设计数据库表:创建一个 Entity Data Model,名为Model.edmx:从刚才的建立的数据库中生成模型:在Web.Config的appSettings节点中新增两个节点,用以设置更新程序的主文件名及更新包下载地址:<appSettings><add key="主程序文件名" value="MyApp.exe"/><add key="更新包下载地址" value="Download.ashx"/></appSettings>引入一个GZip类用以打包(该类的源码将在文章末尾随本文示例源代码一并提供):添加一个新的Web服务,名为Update.asmx:书写如下代码:[WebMethod]public string GetUpdate(string ClientVerison){if (获取最新版本() != ClientVerison){return System.Web.Configuration.WebConfigurationManager.AppSettings["更新包下载地址"];}return null;}static string 获取最新版本(){string v = 获取文件版本(HttpContext.Current.Server.MapPath(string.Format("~/App_Data/Update/{0}",System.Web.Configuration.WebConfigurationManager.AppSettings["主程序文件名"])));using (var c = new DatabaseEntities()){//从数据库取得最新版本信息var q = c.UpdateV ersion.OrderByDescending(f => f.PublicTime).FirstOrDefault();if (q == null || v != q.Version){//数据库中的版本与当前主程序版本不一致时,以主程序版本为准,写入数据库,并生成新的更新文件包var d = new UpdateVersion() { Version = v, PublicTime = DateTime.Now };c.AddToUpdateVersion(d);c.SaveChanges();打包更新文件(HttpContext.Current.Server.MapPath("~/App_Data/Update/"), HttpContext.Current.Server.MapPath("~/App_Data/Update.gzip"));}}return v;}public static void 打包更新文件(string 打包目录, string 输出文件){GZip.压缩(输出文件, Directory.GetFiles(打包目录).Concat(Directory.GetDirectories(打包目录)).ToArray());}public static string 获取文件版本(string 文件路径){FileVersionInfo f = FileVersionInfo.GetVersionInfo(文件路径);return f.FileVersion;}创建Download.ashx,用以输出更新文件包:代码:public void ProcessRequest(HttpContext context){context.Response.ContentType = "application/zip";context.Response.WriteFile(context.Server.MapPath("~/App_Data/Update.gzip"));}服务端至此就编写完毕了。
90收稿日期:2018-03-08作者简介:李刚(1982—),男,山东枣庄人,本科,工程师,研究方向:软件系统开发;周遵四(1989—),男,贵州遵义人,本科,助理工程师,研究方向: 软件系统开发。
软件维护主要是指根据需求变化或硬件环境的变化对应用程序进行部分或全部的修改,作为一个软件设计人员,深知软件维护的重要性。
软件维护活动类型总起来大概有四种:纠错性维护(校正性维护)、适应性维护、完善性维护或增强、预防性维护或再工程。
除此四类维护活动外,还有一些其它类型的维护活动,如:支援性维护(如用户的培训等)。
软件在线自动更新系统就是在设计人员不去现场的前提下,远程实现软件维护工作。
不仅节约人力物力财力的,还大大缩短了软件维护周期。
1 系统概述软件在线自动更新系统使用者包含管理员和访问者两种角色。
管理员使用软件在线自动更新系统进行软件组成文件的上传和维护,访问者使用软件在线自动更新系统进行初始安装、更新和修复操作。
软件在线自动更新系统主要由FTP服务器、数据库、数据库接口和人机界面四个部分组成。
具体介绍如下:FTP服务器主要用于提供软件段包存储控件,便于软件操作系统上传和下载软件段包文件操作。
数据库主要用于存放软件段包信息,便于软件操作系统相关操作。
数据库接口即Web Service,它是软件操作系统和数据库之间的桥梁。
软件操作系统通过数据库接口进行增加、删除、修改和查询操作。
人机界面是访问者和管理员的操作界面,访问者可以通过其进行软件的安装、修复和更新操作,管理员使用其进行上传操作。
2 系统设计2.1 FTP服务器在FTP服务器上分配一个存储空间,用于管理员上传软件组成文件和用户下载安装文件。
2.2 数据库设计数据库共包含四个表,分别为用户权限表、软件信息表、软件文件组成表和已安装软件信息表。
(1)用户权限表(TAB-USER):存储可以登录软件在线自动更新系统的人员信息。
表内容如下:1) USERNAME:用户名称;2)USERPASSWORD:登录密码;3)USERLEVER:用户权限(0,管理员;1,访问者);(2)软件安装表(TAB- SetUPList):存储客户端需要安装的所有软件信息。
c#如何实现⾃动更新程序⽬录主要功能介绍客户端main⽅法⼊⼝主窗体代码更新帮助类版本xml⽂件解析服务端版本xml⽂件⾃动升级服务Controller版本⽂件⾃动⽣成帮助类结语主要功能介绍实现⽂件的⾃动更新。
主要功能:1. ⽀持整包完全更新,即客户端只需输⼊⼀个服务器地址,即可下载所有⽂件。
2. ⽀持增量更新,即只更新指定的某⼏个⽂件。
3. ⽀持⾃动更新程序的更新更新界⾯如图:客户端main⽅法⼊⼝/// <summary>/// 应⽤程序的主⼊⼝点。
/// </summary>[STAThread]static void Main(){//在主程序中更新替换⾃动升级程序//ReplaceAutoUpgrade();bool isEnterMain = false;try{//设置默认更新地址,如果不设置,后⾯会从配置⽂件,或界⾯上进⾏设置UpgradeHelper.Instance.DefaultUrl = "http://localhost:17580";if (UpgradeHelper.Instance.Local_UpgradeModel != null){UpgradeHelper.Instance.UpgradeUrl = UpgradeHelper.Instance.Local_UpgradeModel.UpgradeUrl;}if (UpgradeHelper.Instance.WillUpgrades.Count == 0 && UpgradeHelper.Instance.Local_UpgradeModel != null){//没有待更新,并且本地版本信息⽂件不为空,则直接启动主程序bool isSucced = UpgradeHelper.StartRunMain(UpgradeHelper.Instance.Local_UpgradeModel.RunMain);if (isSucced){Application.Exit();}else{//清理版本信息以便重新检测版本UpgradeHelper.Instance.ClearUpgradeModel();isEnterMain = true;}}else{isEnterMain = true;}}catch (Exception ex){isEnterMain = true;MessageBox.Show("运⾏更新程序异常:\n" + ex.Message, "错误提⽰", MessageBoxButtons.OK, MessageBoxIcon.Error); }if (isEnterMain){//进⼊更新主界⾯Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new FrmUpdate());}}主窗体代码public partial class FrmUpdate: Form{/// <summary>/// 构造函数/// </summary>/// <param name="tempPath"></param>/// <param name="updateFiles"></param>public FrmUpdate(){InitializeComponent();}/// <summary>/// 窗体加载事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void FrmUpdate_Load(object sender, EventArgs e){try{//加载服务器地址txtHostUrl.Text = UpgradeHelper.Instance.UpgradeUrl;BeginUpgrade();}catch(Exception ex){Output("初始化异常:" + ex.Message);}}/// <summary>/// ⼿动更新/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void butBegin_Click(object sender, EventArgs e){try{if(string.IsNullOrWhiteSpace(txtHostUrl.Text)){Output("请先输⼊服务器地址!");return;}UpgradeHelper.Instance.UpgradeUrl = txtHostUrl.Text.Trim();//清理版本信息以便重新检测版本UpgradeHelper.Instance.ClearUpgradeModel();BeginUpgrade();}catch(Exception ex){Output("更新异常:" + ex.Message);}}private void BeginUpgrade(){try{if(string.IsNullOrWhiteSpace(UpgradeHelper.Instance.UpgradeUrl)){return;}if(!(UpgradeHelper.Instance.UpgradeUrl.StartsWith("http://") || UpgradeHelper.Instance.UpgradeUrl.StartsWith("https://"))) {Output("错误的服务器地址,地址必须以http://或者https://开头");return;}//判断是否有更新if(UpgradeHelper.Instance.WillUpgrades.Count > 0 && UpgradeHelper.Instance.Server_UpgradeModel != null){SetWinControl(false);//杀死主进程UpgradeHelper.KillProcess(UpgradeHelper.Instance.Server_UpgradeModel.RunMain);RunUpgrade(); //启动更新}}catch(Exception ex){Output("更新异常:" + ex.Message);}}/// <summary>/// 启动更新/// </summary>private void RunUpgrade(){//启动更新SetCaption(string.Format("共需更新⽂件{0}个,已更新0个。
客户端开发:如何进行应用的更新和升级引言客户端应用的更新和升级是保持应用持续运行和增加新功能的重要方面。
然而,要进行有效的应用更新和升级并不容易,开发者需要考虑多种因素,包括用户体验、数据安全、版本兼容性等。
本文将讨论客户端开发中进行应用更新和升级的一些最佳实践和方法。
一、自动更新自动更新是保持应用最新版本的最便捷的方式之一。
通过实现自动更新功能,开发者可以向用户提供最新的功能和修复的漏洞。
实现自动更新需要考虑以下几个方面:1. 检测更新:应用可以通过向服务器发送请求来检查是否有新的版本可用。
开发者可以使用应用内置的检测机制,或者利用推送通知提醒用户进行更新。
2. 下载和安装:当检测到有新版本可用时,应用需从服务器下载最新的安装包。
下载过程中应提供进度条等用户友好的界面显示。
下载完成后,应用需要引导用户进行安装,可能需要额外的权限申请。
3. 后台更新:为了不打扰用户当前的使用,应用可以在后台进行更新。
通过在用户设备的可用时间段内进行更新,减少对用户体验的影响。
二、灵活的版本管理在应用的开发过程中,经常需要修复已知的问题、增加新功能或者进行性能优化。
为了保持应用的稳定性和兼容性,开发者应该采用一种灵活的版本管理策略。
1. 版本控制:每个应用版本都应该有一个唯一的版本号。
在每次发布新版本时,更新版本号以帮助用户区分不同的更新内容。
开发者可以使用格式,其中X代表重大版本迭代,Y代表小的功能迭代,Z代表错误修复迭代。
2. 版本回退:有时候,新版本的发布可能会出现问题,导致应用无法正常运行。
为了避免用户体验受到影响,开发者应考虑提供版本回退的机制,即用户可以选择回到上一个版本。
这可以通过保留旧版本的安装包或者通过服务器进行版本的在线管理实现。
3. 兼容性考虑:在发布新版本时,开发者需要仔细测试应用在各种设备和操作系统版本上的兼容性。
这可以通过使用自动化测试工具、虚拟环境等方式来实现。
确保新版本在广泛的设备和操作系统上正常运行,可提高用户满意度。
JAVA 实现客户端软件自动更新(一)前段时间做了一个工具发布给公司的各部门使用后反馈了不少BUG,每次修改后均需要发邮件通知各用户替换最新版本,很不方便,因此后来就写了一个自动升级的功能,这样每次发布新的版本时只需要将其部署到自动升级服务器上,工具使用用户运行工具时就会连接到自动升级服务器,检查是否有版本更新,如果有则完成更新后再运行最新版本,否则就运行当前工具版本。
为了使这个自动升级模块具有通用性,我将其做成可以单独运行的程序,而并非集成到工具中,这样则可以为各类软件提供自动升级的功能。
自动升级模块采用SOCKET方式实现升级客户端与服务端的交互,通过版本控制文件autoupdate.xml来控制版本的更新,完成自动更新后会将历史清单history.htm也发送给客户端,并自动打开该文件,使用户可以对本次升级的具体内容一目了然。
详细实现:autoupdate.xml具体内容:其中UpdateServer用户描述服务端的IP和端口;Version为软件的大版本号,Files为软件涉及到的文件,其中的SubVer为具体文件的版本号,其他就顾名思义了。
history.htm具体内容:工作原理:自动升级客户端首先会将本地的autoupdate.xml内容发送给服务端,服务端收到客户端的版本信息后与服务端本地的版本信息(autoupdate.xml)进行比较,首先比较Version,如果一致则通知客户端无需更新,如果不一致则检查Files中各文件的SubVer,服务端将SubVer不一致的文件发送给客户端,对于服务端有而客户端没有的文件也需要发送给客户端,处理完所有File后,服务端将本地的history.htm与传送给客户端,并通知客户端更新完毕;客户端收到更新完毕后的应答后自动打开history.htm,将更新历史信息显示给用户查看。
(二)本实现包括:1、AUPD.java 服务端和客户端之间的通讯协议2、AutoUpdateServer.java 服务端的监听进程3、AUpdSrvProc.java服务端的服务线程,用于处理客户端的自动升级请求4、ClientVerParser.java服务端服务线程用于解决客户端版本信息的类5、AutoUpdateClient.java客户端的自动升级请求进程6、Config.java用于服务端和客户端读取本地配制文件的类7、UpdFile.java用于文件传输的文件对像本实现用dom4j作为解释xml的引擎AUPD.java :AutoUpdateServer.java :避免太大,其他源码见(三)运行服务端:java -cp .;.\bin;.\lib\dom4j-1.6.1.jar;.\lib\jaxen-1.1-beta-4.jar com.icbc.autoupdate.AutoUpdateServer运行客户端:java -cp ./bin;./lib/jaxen-1.1-beta-4.jar;./lib/dom4j-1.6.1.jar; com.icbc.autoupdate.AutoUpdateClient(三)ClientVerParser.java:(四)接CS结构软件自动升级实现(三) :Config.java处理配置文件:UpdFile.java:这个类本来是想作为对象直接在服务端和客户端之间传递的,但后来没有采用,因此在本实现中用处不大谢。
基于VISUAL C++客户端程序自动更新的应用研究朱建凯;郑洪源;丁秋林【摘要】信息管理系统常因客户端的更新不及时或不完备而导致系统运行故障.为解决上述问题,对自动更新程序设计的原理和工作流程进行了研究分析,设计出具有强制更新和断点续传功能的自动更新程序,并使用Visual C++ 编写代码实现了完备的自动更新程序,并将该更新程序应用于某信息隐藏系统,取得了良好的效果.【期刊名称】《计算机应用与软件》【年(卷),期】2010(027)002【总页数】3页(P172-173,187)【关键词】Visual C ++;程序设计;自动更新【作者】朱建凯;郑洪源;丁秋林【作者单位】南京航空航天大学信息科学与技术学院,江苏,南京,210016;南京航空航天大学信息科学与技术学院,江苏,南京,210016;南京航空航天大学信息科学与技术学院,江苏,南京,210016【正文语种】中文0 引言随着计算机网络的日益发展,企业信息管理系统越来越多地应用于企业的日常管理和事务处理,大大提高了企业的办公效率。
此类软件系统客户端多、分布广,企业的网络管理人员技术水平参差不齐,这些都对C/S模式的信息管理系统客户端的更新带来影响,常因更新的不及时或不完全而导致系统运行不正常甚至无法运行。
为此,在分析当前主流的软件系统更新方式的基础上提出了新的自动更新程序设计方案,其主要功能就是当软件系统进行变更时,各客户端主动侦测其变更并自动完成与服务器文件的同步。
其特点就是服务器端文件可以不做成安装程序,而由客户端根据自己的情况进行选择下载更新,并可应对软件系统复杂的目录结构和众多的文件,实现强制更新和断点续传功能,确保客户端软件系统的完备性。
下面将介绍通过Visual C++编写程序来实现C/S模式信息管理系统的自动更新。
1 系统设计原理及设计方案当前常用的自动更新模式主要特点[1]是:①利用版本号控制版本升级。
②更新后的程序单独运行,不需要相互间同步。
文档收集于互联网,已重新整理排版.word版本可编辑,有帮助欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. C#使用FTP实现客户端程序自动更新 最近做的一个项目中需要用到客户端自动更新功能,最初的想法是利用ClickOnce技术来完成,但在实践中发现根本行不能,原因如下:
1)项目应用到了DevExpress控件包,用ClickOnce发布的自动更新程序,客户在安装时报在GAC中找不到控件dll的错。
2)ClickOnce安装无法实现根据用户安装时录入的参数(比如数据库服务器名、数据库用户名和密码等)来动态修改配置文件的功能。
3)最后一下其实不重要了,就是ClickOnce无法实现用户自定义安装文件夹。 最后决定放弃使用ClickOnce,使用ftp方式进行,实现思路如下:用户启动程序时,先运行update.exe,该文件会自动比较本地配置文件和ftp服务器上配置文件的异同,会自动下载上次更新后变化的文件以及新加入的文件。(因为都是基本配置文件,所以开发了一个配置文件生成工具,用户只需要选择根目录后,就会自动生成配置文件。)文件下载结束后,再启动实际的客户端程序。 1using System; 2using ; 3using System.Diagnostics; 4using System.IO; 5using System.Net; 6using System.Threading; 7using ; 8 9namespace Update 10{ 11 /**//// 12 /// Description: 13 /// Author: ZhangRongHua 14 /// Create DateTime: 2009-6-21 12:25 15 /// UpdateHistory: 16 /// 17 public partial class frmUpdate : Form 18 { 19 Fields#region Fields 20 21 private const string CONFIGFILE = "update.xml"; 22 private const string UPDATEDIR = "PMS"; 23 private string appPath = Application.StartupPath; 24 private List errorList = new List(); 25 private string locFile = String.Concat(Application.StartupPath, "\\", CONFIGFILE); 26 private string tmpUpdateFile = "TmpUpdate.xml"; 27 private List updateList; 文档收集于互联网,已重新整理排版.word版本可编辑,有帮助欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. 28 private string updateTmpPath = string.Concat(Path.GetTempPath(), "\\", UPDATEDIR); 29 private string url = String.Empty; 30 31 private FTP ftp = null; 32 33 #endregion 34 35 Delegates#region Delegates 36 37 public delegate void AsycDownLoadFile(string srcFile, string destFile, int i); 38 39 public delegate void ExecuteUpdateFiles(string srcPath, string destPath); 40 41 public delegate void UpdateComplete(); 42 43 public delegate void UpdateUI(int i, string message); 44 45 #endregion 46 47 public event UpdateComplete OnUpdateComplete; 48 49 Constructor#region Constructor 50 51 public frmUpdate() 52 { 53 InitializeComponent(); 54 OnUpdateComplete += new UpdateComplete(frmUpdate_OnUpdateComplete); 55 } 56 57 #endregion 58 59 Event Handler#region Event Handler 60 61 private void frmUpdate_Load(object sender, EventArgs e) 62 { 63 if(Directory.Exists(updateTmpPath)) 64 { 65 Directory.Delete(updateTmpPath, true); 66 } 67 68 // 如果有主程序启动,则关闭 69 Process[] ps = Process.GetProcesses(); 70 foreach (Process p in ps) 文档收集于互联网,已重新整理排版.word版本可编辑,有帮助欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. 71 { 72 //MessageBox.Show(p.ProcessName); 73 if ( == "") 74 { 75 p.Kill(); 76 break; 77 } 78 } 79 80 GetUpdateFiles(); 81 } 82 83 private void frmUpdate_OnUpdateComplete() 84 { 85 ExecuteUpdateFiles dExecuteUpdateFiles = new ExecuteUpdateFiles(ExecuteUpdate); 86 Invoke(dExecuteUpdateFiles, new object[] {updateTmpPath, appPath}); 87 } 88 89 private void frmUpdate_Shown(object sender, EventArgs e) 90 { 91 Thread updateThread = new Thread(new ThreadStart(DownLoadUpdateFiles)); 92 updateThread.SetApartmentState(ApartmentState.STA); 93 updateThread.IsBackground = true; 94 Thread.Sleep(500); 95 updateThread.Start(); 96 97 98 } 99 100 #endregion 101 102 Private Methods#region Private Methods 103 104 /**//// 105 /// 将目标文件替换为本地文件 106 /// 107 /// Author:ZhangRongHua 108 /// Create DateTime: 2009-6-21 10:28 109 /// Update History: 110 /// 111 /// 112 /// The SRC file. 113 /// The dest file. 文档收集于互联网,已重新整理排版.word版本可编辑,有帮助欢迎下载支持. 1文档来源为:从网络收集整理.word版本可编辑. 114 private void DownLoadFile(string srcFile, string destFile) 115 { 116 if(ftp == null ) 117 { 118 ftp = new FTP(Updater.URL, "", Updater.User, Updater.Password); 119 } 120 121 122 123 if(!ftp.Connected) 124 { 125 MessageBox.Show("无法连接远程服务器,无法更新程序", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); 126 Process.Start(Updater.MainProgram); 127 Close(); 128 129 } 130 131 // 得到服务器端的配置文件 132 ftp.Get(srcFile, updateTmpPath, destFile); 133 134 135 136 } 137 138 /**//// 139 /// 得到需要更新的文件清单 140 /// 141 /// Author:ZhangRongHua 142 /// Create DateTime: 2009-6-21 10:29 143 /// Update History: 144 /// 145 /// 146 private void GetUpdateFiles() 147 { 148 Updater.GetBaseInfo(locFile); 149 url = Updater.URL; 150 string svrFile = String.Concat(url, CONFIGFILE); 151 152 if (String.IsNullOrEmpty(svrFile)) 153 { 154 BroadCastOnUpdateComplete(); 155 return;156 } 157