四、下载 (只是处理二级目录) 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

|