5,388
社区成员
发帖
与我相关
我的任务
分享
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdFTP, StdCtrls, idftplist, ComCtrls, ExtCtrls;
type
Thread1 = class(TThread)
private
FidFTP : TIdFtp;
protected
procedure Execute; override;
public
constructor Create(var idFTP : TIdFtp);
end;
Thread2 = class(TThread)
private
FidFTP : TIdFtp;
protected
procedure Execute; override;
public
constructor Create(var idFTP : TIdFtp);
procedure FTP_DeleteAllFiles(var idFTP: TIdFtp; RemoteDir: string);
end;
TForm1 = class(TForm)
IdFTP1: TIdFTP;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
StatusBar1: TStatusBar;
Timer1: TTimer;
Memo1: TMemo;
Button3: TButton;
Edit4: TEdit;
procedure IdFTP1Connected(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure IdFTP1Disconnected(Sender: TObject);
procedure IdFTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: String);
procedure Timer1Timer(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Edit4Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function GetPrevDir(dir:string):string;
end;
var
Form1: TForm1;
T1: TThread;
T2: TThread;
implementation
{$R *.dfm}
procedure TForm1.IdFTP1Connected(Sender: TObject);
begin
Button1.Enabled := false;
Timer1.Enabled := true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not IdFTP1.Connected then
begin
Timer1.Enabled := false;
IdFTP1.Tag := 0;
IdFTP1.Host := Edit1.Text;
IdFTP1.Username := Edit2.Text;
IdFTP1.Password := Edit3.Text;
IdFTP1.Port := strtoint(Edit4.Text);
T1 := Thread1.Create(IdFTP1);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
IdFTP1.Abort;
if IdFTP1.Connected then IdFTP1.Disconnect;
end;
procedure TForm1.IdFTP1Disconnected(Sender: TObject);
begin
Button1.Enabled := true;
if IdFTP1.Tag = 0 then Button1.Click;
end;
procedure TForm1.IdFTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: String);
begin
StatusBar1.Panels.Items[0].Text := AStatusText;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false;
T2 := Thread2.Create(IdFTP1);
end;
{ Thread1 }
constructor Thread1.Create(var idFTP: TIdFtp);
begin
FidFTP := idFTP;
FreeOnTerminate := True;
inherited Create(false);
end;
procedure Thread1.Execute;
begin
try
FidFTP.Connect(true, -1);
except
end;
end;
{ Thread2 }
constructor Thread2.Create(var idFTP : TIdFtp);
begin
FidFTP := idFTP;
FreeOnTerminate := True;
inherited Create(false);
end;
procedure Thread2.Execute;
begin
try
FTP_DeleteAllFiles(FidFTP, '/');
except
end;
end;
{删除整个ftp目录,包括下面的文件, RemoteDir 要删除的目录}
procedure Thread2.FTP_DeleteAllFiles(var idFTP : TIdFtp; RemoteDir : string);
var
i,DirCount : integer;
Temp : string;
begin
idFTP.ChangeDir(RemoteDir);
Form1.Memo1.Lines.Add('ChangeDir:' + idFTP.RetrieveCurrentDir);
idFTP.List(nil);
DirCount := idFTP.DirectoryListing.Count;
if DirCount = 0 then
begin
try
idFTP.RemoveDir(idFTP.RetrieveCurrentDir);
Form1.Memo1.Lines.Add('Success:' + idFTP.RetrieveCurrentDir);
except
Form1.Memo1.Lines.Add('Failed:' + idFTP.RetrieveCurrentDir);
end;
//上级
Temp := Form1.GetPrevDir(idFTP.RetrieveCurrentDir);
if Temp <> '/' then FTP_DeleteAllFiles(idFTP, Temp);
end;
for i := 0 to DirCount - 1 do
begin
if idFTP.DirectoryListing[i].ItemType = ditDirectory then
begin
//下级
FTP_DeleteAllFiles(idFTP, idFTP.DirectoryListing[i].FileName);
end;
if idFTP.DirectoryListing[i].ItemType = ditFile then
begin
Temp := idFTP.DirectoryListing[i].FileName;
try
idFTP.Delete(Temp);
Form1.Memo1.Lines.Add('Success:' + Temp);
except
Form1.Memo1.Lines.Add('Failed:' + Temp);
end;
end;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
try
IdFTP1.Abort;
except
end;
try
T1.Terminate;
except
end;
try
T2.Terminate;
except
end;
IdFTP1.Tag := 1;
if IdFTP1.Connected then
IdFTP1.Disconnect
else
begin
Button1.Enabled := true;
end;
end;
procedure TForm1.Edit4Change(Sender: TObject);
var
Temp : integer;
begin
try
Temp := strtoint(Edit4.Text);
Edit4.Text := inttostr(Temp);
except
Edit4.Text := '21';
end;
end;
function TForm1.GetPrevDir(dir: string): string;
var
rstr : string;
last : integer;
begin
rstr := strrscan(PChar(dir), '/');
last := length(rstr);
Result := copy(dir, 1, length(dir) - length(rstr));
if last = 1 then
begin
rstr := strrscan(PChar(Result), '/');
Result := copy(Result, 1, length(Result) - length(rstr));
end;
end;
end.