Csharp使用FTP实现客户端程序自动更新
- 格式:doc
- 大小:56.00 KB
- 文档页数:9
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 ;
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 UPDA TEDIR = "PMS";
23 private string appPath = Application.StartupPath;
24 private List
25 private string locFile = String.Concat(Application.StartupPath, "\\", CONFIGFILE);
26 private string tmpUpdateFile = "TmpUpdate.xml";
27 private List
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)