以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [分享]项目内部更新-解决方案  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=8392)

--  作者:qtcks
--  发布时间:2010/10/17 22:07:00
--  [分享]项目内部更新-解决方案

中心思想为,建立远程文件数据库(updates),记录需要升级的文件。

2、根据当前客户端版本,对比updates文件。

3、下载并验证

4、切换项目

S:新文件更新上次,并记录入数据库中。

[此贴子已经被作者于2010-10-19 14:30:17编辑过]

--  作者:qtcks
--  发布时间:2010/10/17 22:08:00
--  

1、创建updates 表

Dim Builder As New ADOXBuilder("") \'要指定数据源名称
Dim tbl As ADOXTable
Builder.Open()
tbl = Builder.NewTable("updates") \'创建表
With tbl
    .AddColumn("版本号" ,ADOXType.DateTime)
    .AddColumn("文件路径" ,ADOXType.Text)
    .AddColumn("文件校验码" ,ADOXType.nvarchar,16)
End With

Builder.AddTable(tbl) \'增加表
Builder.Close()
Syscmd.Project.Open(ProjectFile)

[此贴子已经被作者于2010-10-19 20:45:42编辑过]

--  作者:qtcks
--  发布时间:2010/10/17 22:08:00
--  

开发者:新文件上传服务器

Dim bbh As Date = Date.Now \'设置本次上传版本号
\'------------------------设置ftp服务器信息
Dim ftp1 As new ftpclient
ftp1.host=""
ftp1.Account = ""
ftp1.password = ""
\'---------------------获取远程服务器历史文件校验码
Dim dt As datatable
Dim cmd As New SQLCommand
cmd.CSelect 文件路径,文件校验码 from updates"
dt = cmd.ExecuteReader()
Dim ftp_jym As String = dt.GetComboListString("文件校验码")
\'output.show(ftp_jym) \'获取服务器文件校验码
\'==========================
For Each dir As String In FileSys.GetDirectories(ProjectPath & "\\Publish") \'遍历发布项目文件夹
    Dim x As String = dir.Replace(ProjectPath & "\\Publish\\","") \'获取目录名称
    Output.Show(x)
    If ftp1.DirectoryExists("/远程ftp更新目录/" & x) = False Then \'如果不存在目录
        ftp1.MakeDir("/远程ftp更新目录/" & x) \'则创建目录
    End If
   
    For Each File As String In FileSys.GetFiles(dir) \'遍历项目\\ dir 目录下所有文件
        Dim xy As String = File.Replace(dir ,"") \'获取文件名称
        Dim jym As String = CRCCheckFile(File)  \'获取文件校验码
        If ftp_jym.Contains(jym) = False Then   \'对比服务器是否存在本校验码记录.
            ftp1.Upload(file,"远程ftp更新目录/" & x & xy,True) \'上传文件
            cmd.CommandText = "INSERT INTO updates(版本号,文件路径,文件校验码) VALUES(\'" & bbh & "\',\'" & x & xy & "\',\'" & jym & "\')" \'向 updates 记录本次上传文件信息
            cmd.ExecuteNonQuery
        End If
    Next
Next
For Each File As String In FileSys.GetFiles(ProjectPath & "\\Publish") \'遍历目录下所有文件
    Dim xy As String = File.Replace(ProjectPath & "\\Publish\\","") \'获取文件名称
    Dim jym As String = CRCCheckFile(File) \'获取文件校验码
    If ftp_jym.Contains(jym) = False Then  \'对比服务器是否存在本校验码记录.
        ftp1.Upload(file,"远程ftp更新目录/" & xy,True) \'先上传文件
        cmd.CommandText = "INSERT INTO updates(版本号,文件路径,文件校验码) VALUES(\'" & bbh & "\',\'" & xy & "\',\'" & jym & "\')"
        cmd.ExecuteNonQuery
    End If
Next
output.show((Date.now - bbh).Totalseconds) \'记录本次上传时间

[此贴子已经被作者于2010-10-17 22:21:06编辑过]

--  作者:qtcks
--  发布时间:2010/10/17 22:08:00
--  

客户端:新文件下载更新

Dim x As Date = "2010-10-17 18:49:32.000" \'当前版本号
\'==================
Dim dt As datatable
Dim cmd As New SQLCommand
cmd.Cselect b.文件路径,b.版本号,c.文件校验码 from " & _
"(Select DISTINCT cast(t.文件路径 as varchar(80)) 文件路径 ,max(版本号) 版本号 from updates t where 版本号 >=\'" & x & "\' group by cast(t.文件路径 as varchar(80))) b " & _
"INNER JOIN (select * from updates) c " & _
"on c.版本号 = b.版本号 and cast(c.文件路径 as varchar(80)) = b.文件路径 "
dt = cmd.ExecuteReader()

 

 
图片点击可在新窗口打开查看此主题相关图片如下:qq截图未命名.png
图片点击可在新窗口打开查看

 

\'===================== FTP远程服务器信息
Dim ftp1 As new ftpclient
ftp1.host=""
ftp1.Account = ""
ftp1.password = ""
\'--------------------------开始下载
output.show(dt.DataRows.Count) \' 获取当前更新文件量

For Each wj As DataRow In dt.DataRows
    Dim i As Integer
    Dim bd As String = CRCCheckFile(ProjectPath & "\\远程ftp更新目录\\" & wj("文件路径")) \'判断是否已经下载,
    If bd = wj("文件校验码")
        Continue For \'新文件已下载,跳过本次下载,进入下一次循环
    End If
    Do
        ftp1.Download("远程ftp更新目录\\" & wj("文件路径"),ProjectPath & "\\远程ftp更新目录\\" & wj("文件路径"),True) \'下载文件
        Dim Down As String = CRCCheckFile(ProjectPath & "\\远程ftp更新目录\\" & wj("文件路径"))
        If Down = wj("文件校验码")
            output.show("下载成功")
            Exit Do
        End If
        i+=1
    Loop While i<=4  \'重复下载5次
Next

filesys.MoveDirectory(ProjectPath & "\\update\\", ProjectPath, True)
Syscmd.Project.Open(ProjectFile)

[此贴子已经被作者于2010-10-17 22:26:01编辑过]

--  作者:小狐
--  发布时间:2010/10/17 22:26:00
--  

顶你啊


--  作者:qtcks
--  发布时间:2010/10/17 22:29:00
--  

图片点击可在新窗口打开查看争取弄个精华。

通过文件比对的方式,利弊都有。通过综合考虑,我还是选择这种方法来实现

优点:不存在隔代升级障碍。

缺点:远程文件未经打包,下载速度过慢。

嘿嘿。单个文件压缩,不知可行否


--  作者:狐狸爸爸
--  发布时间:2010/10/18 7:45:00
--  

呵呵,设精

 

图片点击可在新窗口打开查看


--  作者:pyh6918
--  发布时间:2010/10/18 11:07:00
--  
学习
--  作者:lihe60
--  发布时间:2010/10/18 11:09:00
--  
这个实用吗?
--  作者:yankunhao
--  发布时间:2010/10/18 16:09:00
--  
呵呵,希望狐狸爸爸能用这个贴的设计思想,给大家一个更好更完善的项目内部更新的方法。