以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  ftp升级后如何才能自动重新打开项目  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=104700)

--  作者:happyft
--  发布时间:2017/8/3 13:34:00
--  ftp升级后如何才能自动重新打开项目
用了下面的ftp下载到本地D盘临时目录自动升级的代码如下:

If ftp.Download("\\Update\\Update2.Zip","D:\\UpdateTemporary\\Update2.Zip",True) = True Then \'如果下载程序文件成功
    UpdatePath = "D:\\UpdateTemporary"
    RemoteUpdate = False
    If Syscmd.Project.Update(False,False) = True Then 

        \'----删除临时升级目录----
        If FileSys.DirectoryExists("D:\\UpdateTemporary") = True Then
            FileSys.DeleteDirectory("D:\\UpdateTemporary",2,2)
        End If
        Return \'升级完成后必须先中止后面的代码,否则会出错
    End If
Else
    MessageBox.Show("由于网络原因下载升级文件失败,请稍后再升级!")
End If

现在每次升级完成后都提示完成,重新启动项目,要如何才能实现升级完成后自动重启项目?

谢谢!

--  作者:shenyl0211
--  发布时间:2017/8/3 14:08:00
--  
看看我的代码,能否帮到你:
http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=103041&skin=0
--  作者:有点甜
--  发布时间:2017/8/3 14:25:00
--  

方法一:

 

下载信息  [文件大小:248.3 KB  下载次数:3]
图片点击可在新窗口打开查看点击浏览该文件:测试.zip

 

方法二:

 

 If Syscmd.Project.Update(False,False) = True Then 

    Application.restart

 End If


--  作者:HappyFt
--  发布时间:2017/8/3 15:50:00
--  
If Syscmd.Project.Update(False,False) = True Then 
        \'----删除临时升级目录----
        If FileSys.DirectoryExists("D:\\UpdateTemporary") = True Then
            FileSys.DeleteDirectory("D:\\UpdateTemporary",2,2)
        End If
       Application.restart
        Return \'升级完成后必须先中止后面的代码,否则会出错
    End If

加在删除了临时目录后再重新启动没问题吧,这样的话是不是下面那个Return就不用了,因为restar因该会自动中止后面的代码吧

--  作者:有点甜
--  发布时间:2017/8/3 16:45:00
--  
以下是引用HappyFt在2017/8/3 15:50:00的发言:

加在删除了临时目录后再重新启动没问题吧,这样的话是不是下面那个Return就不用了,因为restar因该会自动中止后面的代码吧

 

没问题。return要不要都无所谓。


--  作者:HappyFt
--  发布时间:2017/8/4 9:31:00
--  
If ftp.Download("\\Update\\Update2.Zip","D:\\UpdateTemporary\\Update2.Zip",True) = True Then \'如果下载程序文件成功
    UpdatePath = "D:\\UpdateTemporary"
    RemoteUpdate = False
    If Syscmd.Project.Update(False,False) = True Then 
        \'----删除临时升级目录----
        If FileSys.DirectoryExists("D:\\UpdateTemporary") = True Then
            FileSys.DeleteDirectory("D:\\UpdateTemporary",2,2)
        End If
        Application.restart
        Return \'升级完成后必须先中止后面的代码,否则会出错
    End If
Else
    MessageBox.Show("由于网络原因下载升级文件失败,请稍后再升级!")
End If

上面的代码运行下载完成后就什么都没有了,也没有提示升级完成,项目也不会自动重新启动,如果在命令窗口单独运行Application.restart可以重启项目,
为什么上面的代码升级不可以呢

--  作者:有点甜
--  发布时间:2017/8/4 9:55:00
--  

我在afterOpenProject直接执行这句代码,没问题

 

If Syscmd.Project.Update(False,False) = True Then

    Application.restart

End If

 

会先升级,然后提示升级结束请重启,点击确定后,重启项目。


--  作者:HappyFt
--  发布时间:2017/8/4 16:28:00
--  
怎么就不行呢?
我的升级代码是在两处,一处是aftopenproject事件中,大小版的升级都是根据发布日期来判断进行,
另外一处如6楼的代码是在配置栏的一个按钮上,此时项目已经打开,用户在使用中任何时候中只要人为点击这个按钮都下载Update2.Zip到本地D盘再进行升级,不考虑小版本发布日期,目的是有时升级的内容只有个别用户需要,打开项目时就不用提示升级,而让他手动点击按钮升级即可,免得为一个人的功能可能几十人都升级没必要
是不是这句代码If Syscmd.Project.Update(False,False) = True Then  还会自己判断发布日期是否大于本地的当前版本的发布日期,然后才升级?

如果小版本升级时不考虑发布日期,是不是不能用ft默认的这句,想实现只要点击下载成功就进行升级应该怎么写?


--  作者:有点甜
--  发布时间:2017/8/4 16:39:00
--  

如果用这句代码 Syscmd.Project.Update 都是会检测update.txt的日期才升级的。当然,你可以人为的修改update.txt的日期实现你需要的升级。

 

或者是自己编写升级代码,代码也很简单,就是复制文件粘贴,但需要用到 vbs、bat 来做。


--  作者:HappyFt
--  发布时间:2017/8/4 17:19:00
--  
\'下载文件&解压文件&升级文件--------------------
If ftp.Download(dfile,dpath,True) Then  \'显示下载进度
    zip.Open(dpath)
    zip.ExtractAll(utmp1)
    zip.Close
    \'建立升级批处理命令文件--------------------
    Dim s As String = utmp & "\\update.bat"
    If FileSys.FileExists(s) Then
        FileSys.DeleteFile(s)
    End If
    FileSys.WriteAllText(s,"@echo off" & vbcrlf,True,Encoding.Default)
    FileSys.WriteAllText(s,"taskkill /f /im newsource.exe" & vbcrlf,True,Encoding.Default)
    FileSys.WriteAllText(s,"@cls" & vbcrlf,True,Encoding.Default) \'清除屏幕.清除删除 foxtable.exe 进程后屏幕反馈的信息.
    FileSys.WriteAllText(s,"echo Wscript.Sleep Wscript.Arguments(0) * 1000>Delay.vbs" & vbcrlf,True,Encoding.Default)
    FileSys.WriteAllText(s,"Delay.vbs 3" & vbcrlf,True,Encoding.Default)
    FileSys.WriteAllText(s,"del Delay.vbs" & vbcrlf,True,Encoding.Default)
    FileSys.WriteAllText(s,"xcopy /s /e /q /y " & utmp1 & "\\*.* " & upath & vbcrlf,True,Encoding.Default) \'复制升级文件,采用upath变量自动判断升级路径
    FileSys.WriteAllText(s,"@cls" & vbcrlf,True,Encoding.Default) \'清除屏幕.清除升级文件后屏幕反馈的信息.
    FileSys.WriteAllText(s,"start " & ProjectPath & "..\\" & ename & vbcrlf,True,Encoding.Default) \'重启,"..\\"表示上一级目录
    FileSys.WriteAllText(s,"rd /s /q " & utmp & vbcrlf,True,Encoding.Default) \'删除临时文件夹
    
    Dim Proc As New Process \'定义一个新的Process
    Proc.File = s \'指定要打开的文件
    Proc.Verb = "Open" \'指定动作
    Proc.Start()
    proc.WaitForExit
End If

这是以前用的,但每次都会弹出一个CMD的窗口感觉怪怪的,而且有时会被杀毒软件直接杀掉,后来就没用了,还有更好的方式吗?要怎么改进才行