c#思考程序自动升级(2009-06-10)

程序自动升级?上午给我布置这么一个任务,不知道大家以前有没有接触过。我乍听下页觉得这个有什么必要吗?客户端再安装一遍不就行了吗?不过仔细想想,其实这个事情我们每人每天都在做,举个例子,杀毒软件、网游客户端升级都是这样的呀。想起这个还能勉强让我提起点点对这个问题个研究的心趣。下面我就来说说吧。
我们现在的客户端重要是由Client/Server和Browser/Server两种,我们都知道如果要是更新bs的话只需要在
服务器端发布一下就可以了,但是cs客户端就比较麻烦需要一个一个更新。有一劳永逸的方法吗?
在回答这个问题之前我要先提一点事情,就是微软提出的Smart Client。我在网上看到了大量的新名词,什么智能客户端之类,感觉是不是吧问题复杂话了,也可能是我看得不够深入。我个人觉得没想象的那么复杂。回到上面的问题,我个人的回答是“有”。怎么实现呢,看先面我来侃侃:
首先我们先来分析一下什么叫做更新,一点一点的实现。我的编程理念是,一口一口吃饭的人才是吃得最饱的人。呵呵,开个比较形象的玩笑。
1、我觉得更新的实质就是将项目中某些需要修改的文件如dll、exe等文件用新有的文件进行覆盖,和添加新文件。那么知道了这个实质,我们就把不懂的更新问题转化成为知道的覆盖添加文件的问题。
2、要解决这个问题还有个难点,就是一个进程在运行的时候这个进程使用的所有文件都会写入内存,不能被修改(说白了就是一个项目再进的时候它的相关文件都会写入内存,不能被修改)。要解决这在问题也很简单,那就是在当前程序(为了区分我们叫它“程序一”)中再开个新的程序(我们叫“程序二”)将当“程序一”关掉,执行完文件的覆盖添加后在开启程序“程序一”,关闭“程序二”。
3、好现在我们已经将问题细化,并且也仿佛看到了些曙光,那么我们就剩一个字了,“做”。以下代码是在C#语言下写的,这个思想和语言没关系,希望大家能学位已用。
(1)我们来看下如何在“程序一中”打开“程序二”:
string pathTo = @"程序二中.exe文件的路径";
//在“程序一”的进入更新事件中
private void buttonIntoUpdate_Click(object sender, EventArgs e){
Process p = new Process();
p.StartInfo.FileName = pathTo;
p.StartInfo.UseShellExecute = true;
p.Start();
}
(2)我们在“程序二”中先下载“程序一”需要覆盖或者添加的文件集合(详细做法是下载的事情,我不予以详解)
string pathUpdate = @"所下载的文件路径";
string pathDir = @"所下载文件的目录";
string pathTo = @"程序一中.exe文件的路径";
//在“程序二”的更新事件中
private void buttonUpdate_Click(object sender, EventArgs e){
DirectoryInfo fdir = new DirectoryInfo(pathUpdate);
FileInfo[] list = fdir.GetFiles();
foreach (FileInfo f in list)
{
f.CopyTo(pathDir + f.Name, true);
}
Process p = new Process();
p.StartInfo.FileName = pathTo;
p.StartInfo.UseShellExecute = true;
p.Start();
Application.Exit();
}
大家看到了吧,其实我们在第二次运行也就是“p”的时候,这个程序已经是更新好了的程序了。如此,我们便简单的就完成了程序的更新,你说这个是不是很简单呢。
我还要在额外对上面的内容补充几句废话(呵呵对于高手就是废话,对于像我一样的菜鸟就要看看咯),要注意:
1、上面提到的路径要放到config文件下,以便日后变更。
2、版本编号也要放到config文件下,可以和web service交互,用来判断是不是最新版本。
3、现在我在上述讲的方法是更新的全部文件,要更新某些文件的话需要在每个文件上都要有编号标识,更新的时候一个一个检查,将不符合要求的文件进行相应下载,达到更新的效果。
4、当然是对象化了,希望大家用选择自己喜欢的框架和模式。毕竟更新程序也是程序啦,更新程序本身也能更新呀!

posted on 2012-02-02 17:06  张隽永  阅读(294)  评论(0编辑  收藏  举报