引言
随着信息化的快速发展,各种大型的应用系统已经成为一个现代化企(事)业必备的工具。客户机/服务器(C/S)结构的运行模式由于稳定性好、安全性高、运行快速等特点被广泛应用于各种应用系统中,在基于C/S模式的应用系统中,客户端程序的升级是一个不可回避的问题,传统的手工升级工作量大、不可靠,自动升级功能对于整个系统的维护便具有重要意义。
在自动升级系统中,下载文件是最重要也是最复杂的一个步骤,根据升级文件存储方式的不同,可以采用不同的方法将需要升级的文件下载到客户端,实现升级。
PowerBuilder作为一种可视化的面向对象的快速开发工具,被大多数开发人员用来进行C/S模式系统的开发,本文论述的方法在PowerBuilder环境下实现,但这些方法也同样适用于其它开发语言,具有通用性。
1自动升级原理
不同软件自动升级的原理都是类似的。首先,客户端程序运行时,得到服务器数据库中该软件的最新版本信息,与客户端程序当前的版本信息进行比较,如果两者一致,则说明当前系统已经是最新的版本了,若服务器端的版本号大于客户端的版本号,系统会调用自动升级程序,自动升级程序先关闭客户端程序,然后从文件服务器或数据库中下载最新文件,并覆盖旧文件,实现软件的自动升级。
2文件存储
要实现文件下载,首先必须将要升级的文件存储在特定的位置,根据文件存储方式的不同,有不同的下载方法,本文只讨论未压缩文件的存储与下载。
2.1共享文件夹
网络上其他用户可以使用的另一台计算机上的文件夹称共享文件夹。共享文件夹是局域网范围内实现资源共享的常用方式,文件夹共享的设置和管理非常方便,将升级文件存储在共享文件夹中,可以为用户存储和访问升级文件提供一个集中的位置,维护工作量小,但是共享文件夹的安全性较低。
2.2FTP服务器
FTP是指文件传输协议(File Transfer Protocal),即FTP协议,是一种专门用来传送文件的网络协议,简单地说,支持FTP协议的服务器就是FTP服务器。FTP服务器一般由某些FTP服务器程序建立,这种程序不但可以管理服务器中的文件,还可以管理登录服务器的用户,升级文件存储在FTP服务器中,安全性可以得到保证,不过建立和维护服务器需要相关的专业知识和技能。
2.3数据库
由于现代关系数据库中的特殊数据类型(例如SQL SERVER 2000中的image数据类型)可以将文件以二进制流的格式存放在数据库中,这样就可以在数据库中建立一张用来存放升级文件的表,记录文件的数据、修改时间、版本号等信息,然后通过上传程序将升级文件写入数据库中。利用数据库存储升级文件,文件以二进制形式存放不会受到病毒和人为因素的干扰;不过在管理升级文件时需要单独编写文件上传程序,如果升级文件较多,还会影响数据库服务器的响应速度。
3文件下载
3.1批处理文件
批处理文件也叫批处理程序,是一个包含若干DOS命令的文本文件,扩展名为.BAT。批处理文件是一个可执行程序,执行批处理文件时,文件中的一系列命令就会按顺序自动执行,利用DOS扩展命令“XCOPY”可以将指定位置的文件复制到客户机上。
建立一个批处理文件,命名为upgrade.bat,在文件中输入以下命令:
xcopy //192.168.2.7/upfile/*.* /s /y
192.168.2.7是存储升级文件的计算机IP地址,upfile是该计算机上的共享文件夹,参数“/s”表示复制目录和子目录,“/y”表示禁止提示以确认改写一个现存目标文件。在自动升级程序中执行脚本:
run("upgrade.bat")
就可以将共享文件夹中的文件复制到批处理文件所在的目录。此种方法的优点是简单易行,实现方便;缺点也很明显,一是批处理程序运行时,会打开DOS窗口,使界面不够和谐;二是无法判断数据传输是否成功;三是通常只能在局域网范围内实现。
3.2映射网络驱动器
在程序开发中,为了使用共享文件夹中的资源,可以使用映射网络驱动器的方式。映射网络驱动器就是将网络上其他机器的共享文件夹映射成自己机器上的一个磁盘,这样可以提高访问时间。
以Windows98操作系统为例,声明并调用API函数后,就可以建立网络映射驱动器,然后就可以从共享文件夹中复制需要升级的文件了。以下是实现脚本(其中变量as_source为需要网络驱动器地址,as_copy是复制文件目的地址):
//声明网络映射函数
FUNCTION ulong WNetAddConnection(ref string lpszNetPath,ref string lpszPassword,ref string lpszLocalName) LIBRARY "mpr.dll" ALIAS FOR "WNetAddConnectionA"
Long ll_loops, ll_i //文件数,循环次数,循环变量
Long ll_flen, ll_bytes_read, ll_new_pos //文件长度,读取的文件字节数,文件新的位置
Blob lblb_file //复制的文件
Long ll_filenum,li_file_copy //复制文件的句柄
// 得到文件长度,并打开文件
ll_flen = FileLength(as_source)
ll_FileNum = FileOpen(as_source, StreamMode!, Read!, SHARED! )
// 确定读取文件的次数
IF ll_flen > 32765 THEN
IF Mod(ll_flen, 32765) = 0 THEN
ll_loops = ll_flen/32765
ELSE
ll_loops = (ll_flen/32765) + 1
END IF
ELSE
ll_loops = 1
END IF
//读取文件
ll_new_pos = 1
li_file_copy = FileOpen(as_copy, StreamMode!, Write!, LockWrite!, Append!)
//开始复制文件
FOR ll_i = 1 TO ll_loops
ll_bytes_read = FileRead(ll_FileNum, lblb_file )
FileWrite(li_file_copy, lblb_file )
NEXT
//关闭文件
FileClose(ll_FileNum)
FileClose(li_file_copy)
优点:文件下载速度快,下载过程可控制;缺点:一般情况下只能在局域网范围内使用,而且编程时需要调用API函数。
3.3FTP控件
当升级文件存储在FTP服务器上时,只能利用FTP 功能实现文件下载。由于PowerBuilder8.0本身未提供任何FTP功能,因此要实现FTP传输,只能应用PowerBuilder以外的资源。Mabry Internet FTP/X Control是开发中常用的一种FTP控件,该控件由Mabry Software公司提供,它能完成大部分FTP功能,而且在编程中可以方便地控制程序的运行。
注册该控件后,就可以在程序中加入一个该控件的OLE,命名为ole_ftp,属性设置如表1:
表1 FTP控件属性设置
属性 | 设置 | 说明 |
Host | 192.168.2.8 | FTP服务器地址 |
LogonName | user | 登录名 |
LogonPassword | 12345 | 登录口令 |
Timeout | 10 | 超时设定 |
文件下载主要脚本:
//连接FTP服务器
ole_1.object.Connect("user ","12345","")
//将FTP服务器中newver目录下的主程序文件下载到当前目录中
ole_ftp.object.Getfile(" /newver/main.exe "," /main.exe ")
这种下载方式既可以在局域网中实现也可以在Internet中实现,而且文件传输速度快,只是在开发时需要用到OLE,OCX等高级技术,而且引用ftp控件还会增加开发成本。
3.4SQL语句
当升级文件存储在数据库中时,只能用SQL语句进行文件下载。SQL全称是“结构化查询语言(Structured Query Language)”, SQL语言已被确定为关系数据库系统的国际标准,被绝大多数商品化关系数据库系统采用。PowerBuilder中提供了一套完整的嵌入式SQL语句,利用嵌入式SQL语句,可以在程序中灵活地操作数据库。利用SQL语句“SELECTBLOB”可以从数据库中读取升级文件:
SELECTBLOB file_data INTO :lb_file
FROM t_upgradefile
WHERE file_name = :ls_filename;
然后利用文件读写函数将文件数据写入磁盘,完成文件从数据库的下载。
利用SQL语句下载文件可以全程监控文件的下载进度,但是代码编写量大,实现复杂,而且下载文件时,会增加数据库服务器的负荷,影响服务器的响应速度。
4总结
自动升级系统实现文件下载时,采用上述任一种方法不仅可以实现系统中个别模块的升级,也可以实现整个应用系统的的版本升级,以上各种方法已在实际系统中得到应用与检验,具有较强的实用价值。
参考文献
[1] 李玉东,马琳,等.PowerBuilder8.0对象与控件大全.电子工业出版社.2002
[2] 陈小并等.SQL Server 2000培训教程.清华大学出版社.2002