再談使用ftp控件下載一個目錄
上次寫了篇“使用ftp控件下載一個目錄”,裡面寫的目錄下載函數在nt下使用正常,但升級到2000下不能正常使用。
將windows 2000的ftp站點屬性中的目錄列表風格改為unix也不行。我認為是delphi自帶的NMFTP控件太老,對2000支持不好的原因。我在提供該控件的公司的網站上想下載一個最新版本,發現要交$199.95費用!
沒辦法,干脆不用控件,直接用微軟提供的相關ftp函數直接來完成。使用進棧和出棧的原理,有目錄和文件就進棧,下載後就出棧,等到棧空的時候也就是整個目錄(包含各級子目錄)下載完畢的時候。
整個目錄下載的函數如下,有興趣著可參考一下:
function Tmyftp.dir_download(remotedir:string;localdir:string):Boolean;
var dirstack: TStack;
prtdir,nowprtdir: PDirstru;
dirover : Boolean;
begin
result := false;
dirstack := TStack.create;
new(prtdir);
if prtdir<>Nil then
begin
prtdir.ftpdirstr := remotedir;
prtdir.localdirstr := localdir;
prtdir.finishflag := false;
dirstack.Push(prtdir);
if not directoryexists(localdir) then
createdir(localdir);
end;
while dirstack.count>0 do
begin
nowprtdir := dirstack.pop;
change_dir(nowprtdir^.ftpdirstr);
ListHandle := FtpFindFirstFile(FtpHandle,*.*,FindData,0,0);
if ListHandle <> Nil then
begin
dirover := true;
while dirover do
begin
if finddata.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
begin
new(prtdir);
if prtdir <> Nil then
begin
prtdir.ftpdirstr := nowprtdir^.ftpdirstr+finddata.cfilename+;
prtdir.localdirstr := nowprtdir^.localdirstr+finddata.cfilename+;
prtdir.finishflag := false;
dirstack.Push(prtdir);
if not directoryexists(nowprtdir^.localdirstr+trim(finddata.cfilename)) then
createdir(nowprtdir^.localdirstr+trim(finddata.cfilename));
end
else
begin
errno := 4;
errmsg := 在目錄download過程中不能申請得到內存。;
raise FtpException.create(errmsg);
end
end
else begin
try
if not FtpGetFile(FtpHandle,pchar(nowprtdir^.ftpdirstr+finddata.cfilename),
pchar(nowprtdir^.localdirstr+finddata.cfilename),false,0,0,0) then
begin
errno := 5;
errmsg := 在download文件 +nowprtdir^.ftpdirstr+finddata.cfilename+ 時發生錯誤。;
raise FtpException.create(errmsg);
end;
except
on exception do
begin
&n