中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > Internet
再谈使用ftp控件下载一个目录
作者:aton 时间:2001-10-31 10:38 出处:互联网 责编:chinaitpower
              摘要:再谈使用ftp控件下载一个目录

 

再谈使用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
                                 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://aton.126.com

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有