Foxtable(狐表)用户栏目专家坐堂 → [分享]项目自动升级的代码优化


  共有3140人关注过本帖树形打印复制链接

主题:[分享]项目自动升级的代码优化

帅哥哟,离线,有人找我吗?
shenyl0211
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
[分享]项目自动升级的代码优化  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110597 积分:562881 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1653 积分:14702 威望:0 精华:0 注册:2014/6/6 8:42:00
  发帖心情 Post By:2016/11/17 21:58:00 [只看该作者]

学习

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110597 积分:562881 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  6楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57634 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2016/11/18 8:51:00 [只看该作者]

 我们一直用http 更新,从来没有出过错.

 回到顶部
帅哥哟,离线,有人找我吗?
blackzhu
  7楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9879 积分:57634 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2016/11/18 8:52:00 [只看该作者]

Dim s1 As Date = ftp1.GetFiletime(upath & datafile)


这个能获取升级时间? 不会吧,你太牛了,什么跟什么都没有弄明白!



返回ftp上指定文件最后一次修改的日期时间。

Dim ftp1 As New FtpClient
ftp1
.Host="196.128.143.28"
ftp1
.Account = "foxuser"
ftp1
.Password = "138238110"
Dim
sz As Date
sz = ftp1.GetFileTime(
"\photo\jz.png")
Output.Show(
"修改时间:" & sz)


要想获取时间需要获取这个内容的时间才是正道.

[此贴子已经被作者于2016/11/18 8:54:03编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
shenyl0211
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By: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
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2016/11/18 9:24:00 [只看该作者]

谢谢7楼的代码(实质和我的代码一样),原来高手也是这么认为的。

你的质疑说明你没有认真看我的全套代码及解释。
[此贴子已经被作者于2016/11/18 9:24:48编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
bohe
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1077 积分:9923 威望:0 精华:0 注册:2008/9/2 11:34:00
  发帖心情 Post By:2016/11/18 10:38:00 [只看该作者]

支持这样的技术讨论,事情不辨不明。

 回到顶部
总数 11 1 2 下一页