以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [分享]项目自动升级的代码优化 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=92989) |
-- 作者:shenyl0211 -- 发布时间:2016/11/17 19:52:00 -- [分享]项目自动升级的代码优化 敬请狐爸根据我的测试结果改进Syscmd.Project.Update命令。 帮助中的自动升级代码是这样的: If Syscmd.Project.Update(False,False) = False Then \'如果没有升级 Forms("窗口1").open() \'后续其它代码 End If 在某种外网情况下,执行 Syscmd.Project.Update(False,False) 需要用时23秒(见下文)。 而我早期是自己编写自动升级代码的,直接用下列代码进行判断: Dim s1 As Date = ftp1.GetFiletime(upath & datafile) \'服务器上升级文件的日期时间 \'在全局代码中定义: public ftp1 as FTPClient upath & datafile为服务器上的升级路径和update.txt 在同样的外网情况下用时仅1秒。 下面是测试代码: Output.show( Date.Now) ftp1 = new FTPClient \'全局代码中定义ftp1 ftp1.Host = IPa \'全局代码中定义IPa ftp1.Account = ftpaccount \'全局代码中定义ftpaccount ftp1.password = ftppassword \'全局代码中定义ftppassword ftp1.UTF8 = True \'我的服务器需要设为true Dim s1 As Date = ftp1.GetFiletime(upath & datafile) Output.show(s1) Output.show(Date.Now) Syscmd.Project.Update(False,False) Output.show(Date.Now) 下面是项目刚启动时的第一次测试结果,我的方法用时1秒,而帮助中的方法用时23秒 2016-11-17 19:09:19 2016-11-17 16:29:09 2016-11-17 19:09:20 2016-11-17 19:09:43 下面是项目启动后的第二次测试结果,我的方法用时1秒,帮助中的方法用时竟大大缩短为1-2秒!!! 说明Syscmd.Project.Update第一次执行有问题。 2016-11-17 19:11:38 2016-11-17 16:29:09 2016-11-17 19:11:39 2016-11-17 19:11:41 下面是我改进后的全套代码,供参考: \'自动静默下载升级文件并更新 If ProjectFile <> dpath & pfile Then \'非开发状态,dpath为开发文件所有路径,pfile为项目名称 RemoteUpdate = True Dim s1 As Date = ftp1.GetFiletime(upath & datafile) \'服务器上升级文件的日期时间 If s1 > publishdate Then \'如果较现在版本的日期时间新则下载并升级 UpdatePath = "ftp://" & ftpAccount & ":" & ftppassword & "@" & IPa & upath Syscmd.Project.Update(False,False) Syscmd.Project.Exit(False) Return Else Forms("用户登录").Open() End If Else Forms("用户登录").Open() End If [此贴子已经被作者于2016/11/17 19:53:24编辑过]
|
-- 作者:有点蓝 -- 发布时间:2016/11/17 20:41:00 -- 貌似你这个测试对比的方法有问题吧! GetFiletime只是去获取文件的修改时间而已,没有下载文件,更无从说升级了。 而Syscmd.Project.Update做的事情就多了: 1、如果设置为外网升级,就会检测外网是否联通,升级地址是否可以访问 2、下载update.txt判断版本是否需要升级 3、如果需要升级就会下载压缩好的升级文件,下载时间不定,看网络带宽,看是小版本还是大版本升级 4、解压缩升级包并覆盖到客户端 Syscmd.Project.Update已经包含了GetFiletime的功能了,再用GetFiletime就有点画蛇添足了。而且ftp在网络不通的情况下连接服务器耗时可能更多 至于第二次为什么那么快,应该是判断到不需要再升级了,就跳过了第3、4步。
|
-- 作者:shenyl0211 -- 发布时间:2016/11/17 21:39:00 -- 请楼上尊重几个事实: 1、项目能正常运行,就说明外网是通的,无需Syscmd.Project.Update浪费时间判断。 2、升级文件能正常上传,就说明升级地址是可以访问的,无需Syscmd.Project.Update浪费时间判断。 3、FTP服务器与SQL数据库肯定在同一台服务器上,无需Syscmd.Project.Update浪费时间判断。 以上3项是软件开发者该完成的事,而不是Syscmd.Project.Update的事。 4、PublishDate要晚于update.txt文件的时间,就说明只要用getfiletime比较这两个时间就行了,而无需Syscmd.Project.Update先下载update.txt,再从update.txt中提取数据进行时间判断。 所以,Syscmd.Project.Update仍然在浪费时间。 5、只有PublishDate早于update.txt文件的时间时,才需要更新,所以,我仅在这时候使用Syscmd.Project.Update,让Syscmd.Project.Update判断需要进行什么样的升级。所以,我没有额外的下载代码。 6、不是每次运行都需要升级或都有升级,所以,我的方法是最节省时间的。因为仅1秒,所以也不需要用专门的计划管理在后台进行版本检测。而Syscmd.Project.Update不仅越俎代庖,而且方法不对,从而导致浪费大量时间。外网用户每次启动都要延长22秒,能承受吗? [此贴子已经被作者于2016/11/17 21:44:24编辑过]
|
-- 作者:zcgmxf -- 发布时间:2016/11/17 21:58:00 -- 学习 |
-- 作者:有点蓝 -- 发布时间:2016/11/17 22:04:00 -- 我只想说一句:Foxtable的目的之一就是想替代开发者做更多本应开发者做的事情。 另外建议你测试一下自己判断版本,自己下载更新文件解压更新的整个过程。 这种方式可以参考下面链接: http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=90233 http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=82266&replyID=572809&skin=1 |
-- 作者:blackzhu -- 发布时间:2016/11/18 8:51:00 -- 我们一直用http 更新,从来没有出过错. |
-- 作者:blackzhu -- 发布时间:2016/11/18 8:52:00 -- Dim s1 As Date = ftp1.GetFiletime(upath & datafile) 这个能获取升级时间? 不会吧,你太牛了,什么跟什么都没有弄明白! 返回ftp上指定文件最后一次修改的日期时间。 Dim
ftp1 As New
FtpClient 要想获取时间需要获取这个内容的时间才是正道. [此贴子已经被作者于2016/11/18 8:54:03编辑过]
|
-- 作者:shenyl0211 -- 发布时间:2016/11/18 9:11:00 -- 回5楼: 1、在Syscmd.Project.Update出来之前,每个开发者都用自己的代码进行自动升级,我也不例外,还在论坛分享了我的全自动升级代码。 2、我承认,“Foxtable的目的之一就是想替代开发者做更多本应开发者做的事情”,比如Syscmd.Project.Update就代替了很多代码。但3楼所说的前3项确实不是foxtable的事,而是开发者的事。例如: 3楼的第1条,项目刚刚全部打开才几秒钟,你就认为网络可能不通而需要重新判断。那么,就算你判断的时候是通的,难道你不怀疑下载的时候又断了吗?所以,判断网络是否连通不是Syscmd.Project.Update的事,也没必要。 3楼的第2条,如果升级地址是错的,开发者测试的时候就会发现,亦即下列代码中,s1=00:00:00,而不会是实际的update.txt的日期和时间。 Dim s1 As Date = ftp1.GetFiletime(upath & datafile) Output.show(s1) 现在的问题是,Foxtable并没有考虑项目的使用者同时有外网和内网用户,所以,整个帮助文档只单独谈局域网怎么设置或互联网怎么设置,而通过看论坛,根本无需按照帮助文档在项目属性和列属性中作任何设置,用代码就可以解决了。可惜Foxtable作了大量的讲解,却没有合适的代码。比如对3楼提到的 UpdatePath = "ftp://" & ftpAccount & ":" & ftppassword & "@" & IPa & upath,帮助文档根本没有例子,一切都让用户写到属性里。可是IP地址有内网IP1和外网IP2两个,填哪个?但用代码就很简单:先赋值IPa=IP1,再ping内网IP1,ping不通就赋值IPa=IP2。这是局域网和互联网的唯一区别。 3、由3楼的第4条和1楼的例子可知,update.txt只需要保存foxtable的版本日期即可。 4、项目进程映象名称的日期实际上就是foxtable.exe的版本日期,所以,在上述第3条的基础上,只需要判断update.txt的内容与项目进程映象名称的日期即可,以此决定是否需要大升级,根本不需要version.txt,以节约时间。
|
-- 作者:shenyl0211 -- 发布时间:2016/11/18 9:24:00 -- 谢谢7楼的代码(实质和我的代码一样),原来高手也是这么认为的。 你的质疑说明你没有认真看我的全套代码及解释。
[此贴子已经被作者于2016/11/18 9:24:48编辑过]
|
-- 作者:bohe -- 发布时间:2016/11/18 10:38:00 -- 支持这样的技术讨论,事情不辨不明。 |