PB使用WININET的FTP方式自动更新(四、下载)

四、下载
(只是处理二级目录)
global type f_connect_ftpcopyfile from function_object
end type

forward prototypes
global function integer f_connect_ftpcopyfile (hprogressbar hpb_1, long al_copycount)
end prototypes

global function integer f_connect_ftpcopyfile (hprogressbar hpb_1, long al_copycount);
do while yield()
loop

string ls_directorya1 //远程目录
string ls_directorya2 //本地目录
string ls_filename,ls_file

//本地目录
ls_directorya2 = gs_application_path

string ls_directoryb1 //远程目录
string ls_directoryb2 //本地目录

string ls_filename1 //远程文件
string ls_filename2 //本地文件

long ll_hret
long ll_hftp1
long ll_hftp2
long ll_fftp1
long ll_fftp2
long ll_m
long ll_filehandle1,ll_filehandle2

integer li_ret

boolean lb_success
boolean lb_find

s_WIN32_FIND_DATA ss_file1,ss_file2

w_autodown_test.st_ts.text = '正在检查需要更新软件的数量...'
li_ret = f_connect_ftpserver()
if li_ret = -1 then return -1
w_autodown_test.st_ts.text = '正在更新软件版本...'
//建立连接
ll_hret = InternetOpenA(gs_application_name,0,'','',0)
choose case li_ret
 case 1
  ls_directorya1 = GS_FTPDIR1
  ll_hftp1 = InternetConnectA(ll_hret,GS_FTPSERVER1,GL_FTPLOGINPORT1,GS_FTPLOGINUSER1,GS_FTPLOGINPASS1,1,0,0)
 case 2
  ls_directorya1 = GS_FTPDIR2
  ll_hftp1 = InternetConnectA(ll_hret,GS_FTPSERVER2,GL_FTPLOGINPORT2,GS_FTPLOGINUSER2,GS_FTPLOGINPASS2,1,0,0)
 case 3
  ls_directorya1 = GS_FTPDIR3
  ll_hftp1 = InternetConnectA(ll_hret,GS_FTPSERVER3,GL_FTPLOGINPORT3,GS_FTPLOGINUSER3,GS_FTPLOGINPASS3,1,0,0)
 case else
  InternetCloseHandle(ll_hret);
  return -1
end choose
//进入FTP目录
lb_success = FtpSetCurrentDirectoryA(ll_hftp1,ls_directorya1)
if not lb_success then
 InternetCloseHandle(ll_hret);
 InternetCloseHandle(ll_hftp1);
 return -1
end IF
//获取第一个文件
ll_fftp1 = FtpFindFirstFileA(ll_hftp1,'',ss_file1,0,0)
if ll_fftp1 = 0 then
 InternetCloseHandle(ll_hret);
 InternetCloseHandle(ll_hftp1);
 InternetCloseHandle(ll_fftp1);
 return 0
end if
//初始化提示栏
hpb_1.position = 0
ll_m = 0
//是目录
if ss_file1.dwFileAttributes = 16 then
 //远程目录
 ls_directoryb1 = ls_directorya1 + '/' + ss_file1.cfilename
 //本地目录
 ls_directoryb2 = ls_directorya2 + '/' + ss_file1.cfilename
 //本地目录不存在的创建目录
 if directoryexists(ls_directoryb2) = false then
  CreateDirectory(ls_directoryb2)
  ll_m++
  hpb_1.position = ll_m / al_copycount * 100
 end if
 //创建第二个目录句柄
 choose case li_ret
  case 1
   ll_hftp2 = InternetConnectA(ll_hret,GS_FTPSERVER1,GL_FTPLOGINPORT1,GS_FTPLOGINUSER1,GS_FTPLOGINPASS1,1,0,0)
  case 2
   ll_hftp2 = InternetConnectA(ll_hret,GS_FTPSERVER2,GL_FTPLOGINPORT2,GS_FTPLOGINUSER2,GS_FTPLOGINPASS2,1,0,0)
  case 3
   ll_hftp2 = InternetConnectA(ll_hret,GS_FTPSERVER3,GL_FTPLOGINPORT3,GS_FTPLOGINUSER3,GS_FTPLOGINPASS3,1,0,0)
 end choose
 //转移到第二级目录
 lb_success = FtpSetCurrentDirectoryA(ll_hftp2,ls_directoryb1)
 if lb_success  then
  //浏览目录内容
  ll_fftp2 = FtpFindFirstFileA(ll_hftp2,'',ss_file1,0,0)
  //本地文件
  ls_filename2 = ls_directoryb2 + '/' + ss_file1.cfilename
  if fileexists(ls_filename2) = false then
   //本地文件不存在的,直接获取
   FtpGetFileA(ll_hftp2,ss_file1.cfilename,ls_filename2,false,0,0,0)
   ll_m++
   hpb_1.position = ll_m / al_copycount * 100
  else //本地文件存在的,比较文件时间
   ll_filehandle2 = FindFirstFileA(ls_filename2,ss_file2)
   FindClose(ll_filehandle2)
   choose case CompareFileTime(ss_file1.ftlastwritetime,ss_file2.ftlastwritetime)
    case 0
     //两个时间相等,就返回零
    case 1
     //如lpFileTime2小于lpFileTime1,返回1
     //下载
     FtpGetFileA(ll_hftp2,ss_file1.cfilename,ls_filename2,false,0,0,0)
     ll_m++
     hpb_1.position = ll_m / al_copycount * 100
    case -1
     //如lpFileTime1小于lpFileTime2,返回-1
   end choose
  end if
  //遍历目录
  do while InternetFindnextFileA(ll_fftp2, ss_file1)
   yield()
   //本地文件
   ls_filename2 = ls_directoryb2 + '/' + ss_file1.cfilename
   if fileexists(ls_filename2) = false then
    //本地文件不存在的,直接获取
    FtpGetFileA(ll_hftp2,ss_file1.cfilename,ls_filename2,false,0,0,0)
    ll_m++
    hpb_1.position = ll_m / al_copycount * 100
   else //本地文件存在的,比较文件时间
    ll_filehandle2 = FindFirstFileA(ls_filename2,ss_file2)
    FindClose(ll_filehandle2)
    choose case CompareFileTime(ss_file1.ftlastwritetime,ss_file2.ftlastwritetime)
     case 0
      //两个时间相等,就返回零
     case 1
      //如lpFileTime2小于lpFileTime1,返回1
      //下载
      FtpGetFileA(ll_hftp2,ss_file1.cfilename,ls_filename2,false,0,0,0)
      ll_m++
      hpb_1.position = ll_m / al_copycount * 100
     case -1
      //如lpFileTime1小于lpFileTime2,返回-1
    end choose
   end if
  loop
  InternetCloseHandle(ll_hftp2);
  InternetCloseHandle(ll_fftp2);
 end if
else //是文件
 //本地文件
 ls_filename2 = ls_directorya2 + '/' + ss_file1.cfilename
 if fileexists(ls_filename2) = false then
  //本地文件不存在的,直接获取
  lb_find = FtpGetFileA(ll_hftp1,ss_file1.cfilename,ls_filename2,false,0,0,0)
  ll_m++
  hpb_1.position = ll_m / al_copycount * 100
 else //本地文件存在的,比较文件时间
  ll_filehandle2 = FindFirstFileA(ls_filename2,ss_file2)
  FindClose(ll_filehandle2)
  choose case CompareFileTime(ss_file1.ftlastwritetime,ss_file2.ftlastwritetime)
   case 0
    //两个时间相等,就返回零
   case 1
    //如lpFileTime2小于lpFileTime1,返回1
    //下载
    lb_find = FtpGetFileA(ll_hftp1,ss_file1.cfilename,ls_filename2,false,0,0,0)
    ll_m++
    hpb_1.position = ll_m / al_copycount * 100
   case -1
    //如lpFileTime1小于lpFileTime2,返回-1
  end choose
 end if
end if
//遍历目录
do while InternetFindnextFileA(ll_fftp1, ss_file1)
 yield()
 //是目录
 if ss_file1.dwFileAttributes = 16 then
  //远程目录
  ls_directoryb1 = ls_directorya1 + '/' + ss_file1.cfilename
  //本地目录
  ls_directoryb2 = ls_directorya2 + '/' + ss_file1.cfilename
  //本地目录不存在的创建目录
  if directoryexists(ls_directoryb2) = false then
   CreateDirectory(ls_directoryb2)
   ll_m++
   hpb_1.position = ll_m / al_copycount * 100
  end if
  //创建第二个目录句柄
  choose case li_ret
   case 1
    ll_hftp2 = InternetConnectA(ll_hret,GS_FTPSERVER1,GL_FTPLOGINPORT1,GS_FTPLOGINUSER1,GS_FTPLOGINPASS1,1,0,0)
   case 2
    ll_hftp2 = InternetConnectA(ll_hret,GS_FTPSERVER2,GL_FTPLOGINPORT2,GS_FTPLOGINUSER2,GS_FTPLOGINPASS2,1,0,0)
   case 3
    ll_hftp2 = InternetConnectA(ll_hret,GS_FTPSERVER3,GL_FTPLOGINPORT3,GS_FTPLOGINUSER3,GS_FTPLOGINPASS3,1,0,0)
  end choose
  //转移到第二级目录
  lb_success = FtpSetCurrentDirectoryA(ll_hftp2,ls_directoryb1)
  if lb_success then
   //浏览目录内容
   ll_fftp2 = FtpFindFirstFileA(ll_hftp2,'',ss_file1,0,0)
   //本地文件
   ls_filename2 = ls_directoryb2 + '/' + ss_file1.cfilename
   if fileexists(ls_filename2) = false then
    //本地文件不存在的,直接获取
    lb_find = FtpGetFileA(ll_hftp2,ss_file1.cfilename,ls_filename2,false,0,0,0)
    ll_m++
    hpb_1.position = ll_m / al_copycount * 100
   else //本地文件存在的,比较文件时间
    ll_filehandle2 = FindFirstFileA(ls_filename2,ss_file2)
    FindClose(ll_filehandle2)
    choose case CompareFileTime(ss_file1.ftlastwritetime,ss_file2.ftlastwritetime)
     case 0
      //两个时间相等,就返回零
     case 1
      //如lpFileTime2小于lpFileTime1,返回1
      //下载
      lb_find = FtpGetFileA(ll_hftp2,ss_file1.cfilename,ls_filename2,false,0,0,0)
      ll_m++
      hpb_1.position = ll_m / al_copycount * 100
     case -1
      //如lpFileTime1小于lpFileTime2,返回-1
    end choose
   end if
   //遍历目录
   do while InternetFindnextFileA(ll_fftp2, ss_file1)
    yield()
    //本地文件
    ls_filename2 = ls_directoryb2 + '/' + ss_file1.cfilename
    if fileexists(ls_filename2) = false then
     //本地文件不存在的,直接获取
     lb_find = FtpGetFileA(ll_hftp2,ss_file1.cfilename,ls_filename2,false,0,0,0)
     ll_m++
     hpb_1.position = ll_m / al_copycount * 100
    else //本地文件存在的,比较文件时间
     ll_filehandle2 = FindFirstFileA(ls_filename2,ss_file2)
     FindClose(ll_filehandle2)
     choose case CompareFileTime(ss_file1.ftlastwritetime,ss_file2.ftlastwritetime)
      case 0
       //两个时间相等,就返回零
      case 1
       //如lpFileTime2小于lpFileTime1,返回1
       //下载
       lb_find = FtpGetFileA(ll_hftp2,ss_file1.cfilename,ls_filename2,false,0,0,0)
       ll_m++
       hpb_1.position = ll_m / al_copycount * 100
      case -1
       //如lpFileTime1小于lpFileTime2,返回-1
     end choose
    end if
   loop
   InternetCloseHandle(ll_hftp2);
   InternetCloseHandle(ll_fftp2);
  end if
 else //是文件
  //本地文件
  ls_filename2 = ls_directorya2 + '/' + ss_file1.cfilename
  if fileexists(ls_filename2) = false then
   //本地文件不存在的,直接获取
   lb_find = FtpGetFileA(ll_hftp1,ss_file1.cfilename,ls_filename2,false,0,0,0)
   ll_m++
   hpb_1.position = ll_m / al_copycount * 100
  else //本地文件存在的,比较文件时间
   ll_filehandle2 = FindFirstFileA(ls_filename2,ss_file2)
   FindClose(ll_filehandle2)
   choose case CompareFileTime(ss_file1.ftlastwritetime,ss_file2.ftlastwritetime)
    case 0
     //两个时间相等,就返回零
    case 1
     //如lpFileTime2小于lpFileTime1,返回1
     //下载
     lb_find = FtpGetFileA(ll_hftp1,ss_file1.cfilename,ls_filename2,false,0,0,0)
     ll_m++
     hpb_1.position = ll_m / al_copycount * 100
    case -1
     //如lpFileTime1小于lpFileTime2,返回-1
   end choose
  end if
 end if
loop
InternetCloseHandle(ll_hret);
InternetCloseHandle(ll_hftp1);
InternetCloseHandle(ll_fftp1);
return 1

end function

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C/S程序自动升级是一个很重要的功能,原理其实很简单,一般包含两个程序一个是主程序,也就是除了升级功能以外的程序 主要包括以下几点:   1 比较版本  2下载文件  3更新文件 4启动主程序。但其中的需要注意的细节很多。      一般服务端会有一个配置文件包含最新更新的文件信息的配置文件,当然这些更新信息也可以存到数据库,或者其他地方。客户端(也就是需要更新的那部分程序)也有一个配置文件包含客户端版本信息,这些信息可以存到专门的一个配置文件中,或者是config文件中,没有一定的规定,可以根据实际设计。    在客户端程序启动时,先启动更新程序通过比较本地版本和服务端最新的版本信息判断是否有新版本,如果有可以直接下载下载完成替换成功后并更新客户端版本信息,启动主程序。             缺点:如果更新速度由于更新的文件很大或者网速很慢,用户不得不等待很长时间,直到下载完成或者下载失败。             优点:处理完成后,启动的直接就是更新后的程序。不会出现由于主程序在运行导致替换文件时提示文件在使用,不能替换之类的错误。    另一种方法是, 在客户端段程序启动时,启动更新程序,但更新程序不做版本判断,到客户端更新目录下检查有没有下载的新版本,如果有就更新主程序并更新客户端版本信息,然后启动主程序,如果没有就直接启动主程序。由主程序判断是否有新版本,并在后台下载把文件放到客户端更新目录中,下载完成后,提示用户退出主程序,重新启动,在启动时由更新程序并更新客户端和客户端版本信息。                 缺点:由于下载是在主程序的后台运行,可能会影响主程序的处理速度。             优点:避免了由于下载导致用户长时间的等待。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值