如何用idftp遍历整个目录—-下载、删除_delphi教程

如何用idftp遍历整个目录—-下载、删除_delphi教程如何用idftp遍历整个目录—-下载、删除_delphi教程unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,IdBaseComponent,IdComponent,IdTCPConn…

大家好,又见面了,我是你们的朋友全栈君。

如何用idftp遍历整个目录—-下载、删除_delphi教程

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.DirectoryListing[i].FileName,true);

      Form1.lb_num.Caption := IntToStr(StrToInt(Form1.lb_num.Caption) + 1);

      Form1.lb_num.Update;

      if i = DirCount – 1 then

      begin

        idFTP.ChangeDirUp;

        idFTP.List(nil);

      end;

    end;

  end;

end;

{删除整个ftp目录,包括下面的文件,

 RootDir = 要删除的根目录,一般情况下 RemoteDir 与 RootDir 相等}

procedure FTP_DeleteAllFiles(var idFTP : TIdFtp;RemoteDir,RootDir : string);

label Files;

var

  i,DirCount : integer;

  Temp : string;

begin

  idFTP.ChangeDir(RemoteDir);

  if Pos(RootDir,idFTP.RetrieveCurrentDir) = 0 then Exit;

Files :

  idFTP.List(nil);

  DirCount := idFTP.DirectoryListing.Count ;

  while DirCount = 0 do

  begin

    Temp := idFTP.RetrieveCurrentDir;

    idFTP.ChangeDirUp;

    idFTP.RemoveDir(Temp);

    idFTP.List(nil);

    DirCount := idFTP.DirectoryListing.Count ;

    for i := 0 to DirCount – 1 do

    if idFTP.DirectoryListing[i].FileName = RootDir then Exit;

  end;

  for i := 0 to DirCount – 1 do

  begin

    if Pos(RootDir,idFTP.RetrieveCurrentDir) = 0 then Break ;

    if idFTP.DirectoryListing[i].ItemType = ditDirectory then

    begin

      FTP_DeleteAllFiles(idFTP,idFTP.DirectoryListing[i].FileName,RootDir);

    end else begin

      idFTP.Delete(idFTP.DirectoryListing[i].FileName);

      Form1.lb_num.Caption := IntToStr(StrToInt(Form1.lb_num.Caption) + 1);

      Form1.lb_num.Update;

      goto Files ;

    end;

  end;

end;

procedure TForm1.Btt_DownLoadDirClick(Sender: TObject);

begin

  IdFTP1.Connect(true,-1);

  if IdFTP1.Connected then

  begin

    IdFTP1.ChangeDir(bigimage);

    FTP_DownloadDir(IdFTP1,1002.1002.1002,g:\ftpdir\);

  end;

  IdFTP1.Disconnect ;

end;

procedure TForm1.Btt_DeleteDirClick(Sender: TObject);

begin

  IdFTP1.Connect(true,-1);

  if IdFTP1.Connected then

  begin

    IdFTP1.ChangeDir(bigimage);

    FTP_DeleteAllFiles(IdFTP1,1002.1002.1002,1002.1002.1002);

  end;

  IdFTP1.Disconnect ;

end;

end.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150399.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月18日 上午10:36
下一篇 2022年6月18日 上午10:36


相关推荐

  • 函数声明[通俗易懂]

    函数声明[通俗易懂]语法描述通过函数声明构造的函数是Function对象,所以拥有一切Function对象所有的属性,方法和行为。函数默认返回undefined,如果想返回其他值,函数必须使用return语句来返回

    2022年8月4日
    9
  • 假设检验

    假设检验

    2026年3月15日
    1
  • disruptor 介绍

    disruptor 介绍Disruptor 是英国外汇交易公司 LMAX 开发的一个高性能队列 研发的初衷是解决内部的内存队列的延迟问题 而不是分布式队列 基于 Disruptor 开发的系统单线程能支撑每秒 600 万订单 2010 年在 QCon 演讲后 获得了业界关注

    2026年3月20日
    2
  • laravel拓展validator验证

    laravel拓展validator验证

    2021年10月26日
    54
  • 利用 USB转485通过Wireshark抓取MSTP数据

    利用 USB转485通过Wireshark抓取MSTP数据1.准备USB转485的硬件设备,将+连到MSTP通讯的+,一连到MSTP的-.USB头插到PC上2.下载wireshark,然后一路安装到底。安装完wireshark后,到https://sourceforge.net/projects/bacnet/files/bacnet-tools/下载BACnet新版的tools,下载好后解压找到mstpcap.exe拷贝到wireshark安装目录中的extcap中。3.打开wireshark软件,插好USB转485工具。按下图找到BACne..

    2022年5月23日
    72
  • 中国成功发射第二颗北斗导航卫星,有感

    中国成功发射第二颗北斗导航卫星,有感首先,听到这个是心情很激动,觉得祖国离强国的距离又近一步。但又在想何时我想的卫星定位可以象GPS那样广范应用。我以前也做过几个相关项目,如果可以用自己国家的我一定会放弃GPS,为我国的3S发展出自己的一份力。 第一次自己写,写的很少。只是一点感想。

    2022年7月27日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号