Csharp使用FTP实现客户端程序自动更新

  • 格式:doc
  • 大小:56.00 KB
  • 文档页数:9

下载文档原格式

  / 9
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 errorList = new List();

25 private string locFile = String.Concat(Application.StartupPath, "\\", CONFIGFILE);

26 private string tmpUpdateFile = "TmpUpdate.xml";

27 private List updateList;

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)