四、下载
(只是处理二级目录)
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_suclearcase/" target="_blank" >ccess
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 = Inte.netOpenA(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