Foxtable(狐表)用户栏目专家坐堂 → [分享]项目内部更新-解决方案


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

主题:[分享]项目内部更新-解决方案

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


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
[分享]项目内部更新-解决方案  发帖心情 Post By:2010/10/17 22:07:00 [显示全部帖子]

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

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

3、下载并验证

4、切换项目

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

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

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


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By: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编辑过]

[本帖被加为精华]
 回到顶部
帅哥哟,离线,有人找我吗?
qtcks
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By:2010/10/17 22:29:00 [显示全部帖子]

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

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

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

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

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


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


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By:2010/10/19 19:53:00 [显示全部帖子]

嘿嘿,谢谢CZY的建议,受益良多。

貌似movedirectory没报错。

 


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


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By:2010/10/19 19:57:00 [显示全部帖子]

我现在的应用是:添加2条内部函数。

为文件上传、文件下载

项目:Initialize事件设置文件更新代码:

 

Connections.Add("Conn_Source", GetConfigValue("Conn", "Error")) 'conn保存外部数据源连接字符串;
Dim cmd As New SQLCommand
cmd.C
cmd.CommandText = "Select max(版本号) from updates"
Dim Ser_bbh As Date = cmd.ExecuteScalar
SaveConfigValue("S_bbh", Ser_bbh)
Dim Chi_bbh As Date = GetConfigValue("C_bbh","#0001-01-01 0:00:00#")
If Ser_bbh > Chi_bbh Then
    Functions.Execute("文件下载")
End If
 

文件正常下载后,更新客户端版本号;C_bbh

[此贴子已经被作者于2010-10-19 19:57:52编辑过]

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


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By:2010/10/19 20:00:00 [显示全部帖子]

我的项目,所有内容都在服务器sql中,没有对内部表进行应用,

内部表只存在一个表,保存着自定义登陆窗口、网络设置窗口。


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


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By:2010/10/19 21:46:00 [显示全部帖子]

本地目录与服务器目录的遍历代码还有缺陷。

 


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


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By:2010/10/19 21:47:00 [显示全部帖子]

项目发布后,在本地运行项目后,在上传项目,dll动态链接库没有关闭。上传文件出错。

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