这两天做一个项目,其中需要用ftp下载服务器上的整个目录,并且下载完成后,删除整个目录。由于ftp不能穿透子目录,只能在当前目录下操作,所以用一般的方法根本无法达到预期效果。可能我想偷懒吧!于是想从网上搜搜,看有没有现成的东东拿来使用 :)
结果令我非常失望,不是无法运行就是达不到我的预期效果。其实论坛上也有人问过这样的问题,可一直也没有满意的结果。哎!还得靠自己呀!小日本可没有那么听话,不知道大家听没听说钓鱼岛,去没去参加游行。
下面的程序是用delphi7.0 + idftp 实现的。可能还会有bug,不过希望能给需要他的人带来一点点帮助和提示!,程序中只有下载与删除的代码,至于上传的code自己写吧,稍微思考一下就可以实现。
unit unit1;
interface
uses
windows, messages, sysutils, variants, classes, graphics, controls, forms,
dialogs, stdctrls, idbasecomponent, idcomponent, idtcpconnection,idftplist,
idtcpclient, idftp ;
type
tform1 = class(tform)
btt_downloaddir: tbutton;
idftp1: tidftp;
btt_deletedir: tbutton;
label1: tlabel;
lb_num: tlabel; //处理文件个数提示。
procedure btt_downloaddirclick(sender: tobject);
procedure btt_deletedirclick(sender: tobject);
private
{ private declarations }
public
{ public declarations }
end;
var
form1: tform1;
implementation
{$r *.dfm}
{ 下载整个目录,并遍历所有子目录
首先 changedir(root) 到根目录
然后创建本地目录 + remotedir
然后用 list 得到所有目录名
循环判断,进入 remotedir 目录内部
如果是目录继续第归。否则 get 该文件到本地目录,当 get 完所有文件后返回上一级目录
用list再取得信息,继续循环
}
procedure ftp_downloaddir(var idftp : tidftp;remotedir,localdir : string);
label files ;
var
i,dircount : integer;
begin
if not directoryexists(localdir + remotedir) then
forcedirectories(localdir + remotedir);
idftp.changedir(remotedir);
idftp.list(nil);
dircount := idftp.directorylisting.count ;
if dircount = 0 then
begin
idftp.changedirup;
idftp.list(nil);
end;
for i := 0 to dircount - 1 do
begin
if dircount <> idftp.directorylisting.count then
begin
repeat
idftp.changedirup;
idftp.list(nil);
until dircount = idftp.directorylisting.count ;
end;
if idftp.directorylisting[i].itemtype = ditdirectory then
ftp_downloaddir(idftp,idftp.directorylisting[i].filename,localdir + remotedir + ''\'')
else begin
idftp.get(idftp.directorylisting[i].filename,localdir + remotedir + ''\'' +
idftp.directorylistin