使用ftp控件下载一个目录2
2001-04-24 11:33
489 查看
使用ftp控件下载一个目录2
上次写了篇“使用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
errno := 6;
errmsg := '在download文件 '+nowprtdir^.ftpdirstr+finddata.cfilename+' 时发生例外错误。';
raise FtpException.create(errmsg);
end;
end
end;
dirover := InternetFindNextFile(ListHandle,@finddata)
end;
InternetCloseHandle(ListHandle);
end
else
begin
end;
dispose(nowprtdir);
end;
end;
http://www.softcows.com/cn
上次写了篇“使用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
errno := 6;
errmsg := '在download文件 '+nowprtdir^.ftpdirstr+finddata.cfilename+' 时发生例外错误。';
raise FtpException.create(errmsg);
end;
end
end;
dirover := InternetFindNextFile(ListHandle,@finddata)
end;
InternetCloseHandle(ListHandle);
end
else
begin
end;
dispose(nowprtdir);
end;
end;
http://www.softcows.com/cn
相关文章推荐
- 使用ftp控件下载一个目录
- 如何使用asp.net中的控件将一个图片文件从一个目录传到另外一个目录下?
- 一个实用的FTP客户端,包含下载目录
- 使用递归方法实现,向FTP服务器上传整个目录结构、从FTP服务器下载整个目录到本地的功能
- 使用FTP下载目录,即FTP命令批量自动下载
- 使用.net FtpWebRequest 实现FTP常用功能 上传 下载 获取文件列表 移动 切换目录 改名
- 一个简单的使用wininet的http/ftp文件下载程序
- QT QFtp使用实例 从FTP下载一个文件
- 使用 wget 从 ftp上下载文件到指定目录
- 命令行中怎样用FTP命令下载一个目录(已解决)
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- 发布一个API写的FTP上传下载控件
- 使用FTP下载目录,即FTP命令批量自动下载的bat文件
- Delphi7 中利用Indy的TidFtp客户端控件实现在服务器指定目录下下载需要的文件
- 使用FTP下载目录,即FTP命令批量自动下载的bat文件
- QT QFtp使用实例 从FTP下载一个文件
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- 下面是一个使用FTPClient来实现的FTP上传和下载的功能