分类: WINDOWS
2011-11-08 16:04:28
关于软件自动升级程序的设计方法
软件自动升级,就必须要原来的软件代替了。但是如何代替现在正在运行软件?
方法只有一种,即是用第三方法软件。
这个第三方法软件可以好几种,1.是Bat(批处理软件)。2.自编软件。
这两种方式的程序编的是不相同的。
第一种:Bat软件的设计原理如下:
1.通过程序得到需要升级的需求。
2.用程序生成一个Bat文件,通过Bat得到最新的软件。
3.再关闭这个程序,并通过Bat得到代替原有的软件。再删除自动删除Bat文件。
第二种:自编升级软件,设计原理如下:
1.通过程序得到需要升级的需求。
2.关闭自己,并运行自编的软件,最后,得到这个软件,并覆盖软件。
3.最后,关闭自动升级软件,并运行软件。
第一种的好处:不用再写升级软件。但是同时要制定Bat处理过程软件。
第二种的好处:流程明确,并且可以通过进程条的形式显示程序更新的过程。(这种是比较流行的升级方式)。
简单的自动更新程序
很多软件都有一个自动升级的程序。
每次启动软件前,先启动自动升级程序来检查是否需要更新。
如果需要更新,那么就下载更新文件替换原先的文件。
最近也有类似这样的需求,要求大概是:
1.要更新的只有一个文件,这个文件一般不会很大。
2.更新过程,最好不要留下什么明显的痕迹。
3.更新程序,不需要有界面。
根据这个要求,一个通宵下去,
做了一个更新类,网络通信部分用的是Wininet(用套接字太麻烦了)
这个类的使用demo如下:
上图是对比我在如鹏网发的刷帖机程序,如果不一致就下载到内存中,然后写入磁盘文件。
(对比的结果如果是本地文件不存在的话,也可以下载到内存,然后写入)
可执行:
Update.rar (45.47 KB)
源代码:
自动更新(根据日期).rar (23.52 KB)
实现更新的步骤和思路如下:
1.本地文件与服务器上的文件进行对比。不同的话,才下载。
对比的方式有很多,可以在服务器上放一个更新文件列表,用MD5值来判断是否相同。
这种更新方式以前用过,有点麻烦,每次在服务器上更新文件,总要计算一次MD5,
然后一起写入更新文件列表来给客户端判断是否需要更新。
现在,新想出一个办法,不用MD5来判断文件是否相同,而用文件的最后修改时间。
这个做起来会比较简单,并且更新也比较方便。
但是,客户机和服务器的时间肯定是不一样的,如何判断是否需要更新呢?
我的做法是:先查询服务器上的指定文件的最后修改时间,
然后和客户机上的指定文件的最后修改时间进行对比,
如果,时间不一致,就说明,需要更新了。
更新完毕后,把客户机上的文件的最后修改时间设置成服务器上的文件的最后修改时间
这样做,就使得每次更新后,客户机和服务器上的文件的时间同步了。
如果服务器上的文件进行了改动,那么下次对比时,一定会和客户机上的文件时间不一样
通过这个手段来判断是否需要更新。
有了对比的思路后,就是具体的实现了。
用Wininet去查询服务器上的文件的最后修改时间,得到的是格林尼治时间的字符串。
我没有找到现成的转换函数,
就自己写了一个函数把格林尼治时间字符串转换成了SYSTEMTIME时间结构。
(当然格林尼治时间是没有毫秒这个域的,SYSTEMTIME对应的毫秒域约定设置为0)
再把SYSTEMTIME时间结构转换成FILETIME(文件时间结构)
为什么要进行这么多步时间结构的转换?因为读取本地文件的最后修改时间,
是以FILETIME(文件时间结构)返回的。所以,获取服务器文件的时间也要转换为这个结构
才能够进行对比。
其实,这个对比更新的思路和浏览器拿缓存文件与网站进行对比、判断cookie是否过期
是差不多的。
2.下载。
因为更新的过程要求尽量隐蔽些,所以,不能一边下载一边写入文件。
因为这样做,万一下载写入到一半,死机了,或是断网了,
会造成用户不能使用这个文件,而被察觉。
由于要更新的文件也不大,
我的采取做法是,先下载到缓冲区(内存中),
等待下载完毕后,再一次性写入。
3.写入文件。
这个就是把下载缓冲区的内容写入文件了。
写入完成后,设置文件的最后修改时间与服务器上的文件最后修改时间一致。