燃香小狼 发表于 2016-3-19 14:29

【原创源码】以易语言为例分析,分析程序的自动更新功能

本帖最后由 奋斗丶小Z 于 2016-3-20 16:28 编辑

摘要:本帖以易语言为例,探讨程序的自动更新功能。详细分析了其实现原理和方法,深入探讨,并在一些关系到用户体验的方面的细节进行了研究,形成了一套完整但不算特别完美的自动更新程序。文章最后会以附件形式将用到的源码一并打包分享,借此以供需要的人参考。关键词:程序,自动更新,易语言
1 前言:随着互联网的发展,个人开发者数量越来越多。相比企业级的开发团队来说,个人开发者因精力时间等问题,将程序的“自动更新”功能省略掉。一个程序的自动更新像一个人的成长一样,不断的进行着自我发展、自我完善,与此同时对用户来说,往往意味着新的功能、新的体验、甚至新的感觉。某大神(自己杜撰的,哈哈。。。)在文章中指出,很多个人开发着忽略程序自动更新的原因如下:(1)没有稳定的网络空间;(2)没时间精力去研究自动更新功能;(3)其他原因。本文将重点围绕第二点,程序的自动更新功能展开讨论,为了真正意义上实现免费稳定空间的自动更新功能,文章会简单介绍一些免费稳定的空间及其使用方法。
2 判断程序是否为最新版由于程序最新的版本信息是放在互联网的,因此判断程序是否需要更新就需要连接互联网,这里以某硕网盘为例进行说明,该网盘文件地址解析工具(来自互联网)会提供源码以及成品E模块。该解析源码有如下功能:(1)遍历网盘根目录;(2)遍历根目录下所有文件,不支持二级目录;(3)获取特定文件的下载地址(需要提供网盘地址,目录名,文件名三个参数)。依据该模块(暂将此功能集合称为模块,下文亦如此)的功能,可以在网盘新建一个跟文件夹例如“SoftUp”,然后将需要更新的文件上传至此。但是如果有多个软件需要更新时,受限模块本身的功能,更新文件夹不易管理,为了方便更新文件夹的管理以及更新程序的模块化开发,建议为每个程序都建立一个根目录,用来存放该程序的更新文件和更新说明等信息。这也是我的解决方案,因此如果大家用此网盘作为更新空间的话,推荐此方法。新版程序的版本号以及更新内容,存放在一个叫1.5.txt文本文件内,这里的1.5为程序版本,文件内容为更新说明。程序启动后用模块遍历特定目录下(这个目录与需要更新的文件是一一对应的)的文件,返回一个文件列表的文本型数组,然后遍历出说明文件,如图1所示。

                  图1 对比文件版本号1
如果更新内容里面有txt格式的文件,那更新说明的文档就换一个命名方式例如about_1.5.txt,这时可以换一种方法来寻找更新说明文件,方法如图2所示。             图2对比文件版本号2
这里是用易语言自带的“取文件版本信息()”这个命令来获取当前程序的版本信息,获取到以后不能直接与网络版本进行比较,如果网络版本比较新就提示需要更新,把更新内容也一起列出来。可以看出我这里用了一个“http读文件”,因为这个说明文件比较小(一般不到1K),所以可以简单一点读取就行了。
3更新这个是本文的重点,上面写到主程会检查程序版本和更新内容,当用户选择更新后,就可以启动更新程序进行更新了。3.1配置更新文件这里咱们需要在主程序启动更新程序的时候,传递一个参数,也就是更新配置文件名,这个配置文件里面包含如下信息:(1)需要更新的文件列表;(2)与文件列表对应的文件下载地址;(3)更新文件存放的路径;(4)其他一些信息。当然在主程序启动子程序的时候,完全可以不用传递这个参数,更新程序启动后直接读取这个配置文件也是可以的,但是我觉得这样不太好,因为一旦配置文件名发生变化,更新程序就无法读取到需要的资料,同样不利于程序的模块化开发。本人的解决方法是在主程序目录下新建一个uplist的配置文件(当然不写后缀名了)然后主程序在检测到用户需要更新时,将遍历到的文件名和下载列表写到配置文件里面,具体代码见图3。图3 处理下载配置文件写完配置程序以后,就可以启动更新程序了,上面代码可以看出我在启动更新程序的时候传递了一个参数“uplist”,这个文件的位置是固定的(就在根目录下),当然这个参数可以是配置文件的全路径,也可以是主程序的更新地址(让更新程序启动后,直接下载这个文件就OK了,但是不推荐这种方法)。需要说明的是,主程序启动的时候记得删除这个配置文件,确保这个配置文件是最新的。3.2更新程序
配置好需要下载的文件以后,启动更新程序后,更新程序的启动初始化代码如图4所示。图4 更新程序初始化用一个文本型参数接收主程序传递过来的参数“取命令行(命令行参数)”,注意这里的返回值。先判断命令参数的长度,小于1或者为空说明没传递参数,就直接结束程序的运行。(不让更新程序单独运行)。我这里为了防止旧更新文件对程序的影响,直接将更新文件夹删掉,新建一个空的更新文件夹,然后启动更新线程(用线程的目的是,让主窗口可以活动),对文件进行下载的代码,直接借用前人的成果(易语言自带的有下载功能,直接调用即可),这部分不进行讲解,会发源码给大家。读取下载地址程序代码如图5所示。图5 读取下载地址本人喜欢用“循环判断首”命令,结尾直接写真,我用中间代码控制是否结束循环,这里面配置了每个下载文件的文件名(该文件名包含在“本地路径”里面),如果这里不配置下载后保存的文件名,程序会自动保存网络上的名字(很长一串字符),导致根本无法进行后期处理。
下载文件()子程序,我本来打算也用线程的,发现线程处理起来没有我这样直接调用方便,就在调用“下载文件()”后用一个循环来等待,当一个文件下载完成以后,再启动下一个文件的下载。(这里的下“载文件()”子程序更好的写法是应包含两个参数,一是下载地址,一是保存路径,我这里就偷懒了。。。),从图5可以看出,所有下载结束以后,还有个后处理子程序,其程序代码见图6。图6 跟新后处理这里主要是将下载好的文件,依次拉出来放到主程序目录下,处理方法简单粗暴,准确一点的方法应该是,主程序在写更新配置文件的时候把每个文件的路径卸载配置文件里面,然后更新程序按照要求进行操作。最后当然就是启动更新后的主程序,然后结束自己的运行。这里需要说明一点,如果更新的同时需要更新“更新程序”,就可以在下载完文件后把更新程序up.exe移动到主目录下改名为up_new.exe,然后在主程序启动的时候,把up.exe删除,将up_new.exe重命名为up.exe即可,这样就可以达到所有文件的自动更新了。
结论:在论坛搜了一圈,发现没有专门自动更新写帖子的,于是就结合自己最近写的一个程序给大家分享一下我的解决方案。这里仅仅是提供一种方法,如果有更好的方法,欢迎分享交流。
参考文献: www.52pojie.cn
源码:网盘地址:**** Hidden Message *****(失效不补)

燃香小狼 发表于 2016-3-20 21:03

闲月疏云 发表于 2016-3-20 13:38
楼主来个C++的自动更新呗,比E有挑战性

这里只是提供了一个方法,C++原理也是一样的

燃香小狼 发表于 2016-3-20 12:56

277176199 发表于 2016-3-20 11:34
模块是什么模块啊???自己写的么

获取下载地址的模块,不是本文重点讨论对象,该模块来自网络

大葡萄干丶 发表于 2016-3-19 14:34

听众前排 来顶作者

micksoft 发表于 2016-3-19 14:39

收藏了先

plumebase 发表于 2016-3-20 05:50

收藏了先

277176199 发表于 2016-3-20 11:34

模块是什么模块啊???自己写的么

j197100724 发表于 2016-3-20 11:41

皆以一下 谢谢楼主

ddk313 发表于 2016-3-20 13:27

学习学习

闲月疏云 发表于 2016-3-20 13:38

楼主来个C++的自动更新呗,比E有挑战性

鹤壁葫芦娃 发表于 2016-3-20 13:40

不错值得学习学习
页: [1] 2
查看完整版本: 【原创源码】以易语言为例分析,分析程序的自动更新功能