(07-11-2021, Saat: 15:43)mrmarman Adlı Kullanıcıdan Alıntı: Host size ait olmadığı için mecburen recursive çözüm üreteceğiz...
Aşağıdaki örnekte bir defa IdFTP nesnesi create ediliyor. Hayat döngüsü içerisinde klasör ve dosyalar içten dışa gezilerek siliniyorlar, sonunda nesne free ediliyor.
Örnek :
procedure FTPDirectoryRemove( aHost, aRemotePath, aUsername, aPassword: String );
procedure RecursiveFileDelete( aFTP: TIdFtp; aFolderName: String );
var
i : Integer;
LList : TStringList;
begin
LList := TStringList.Create;
try
aFTP.ChangeDir(aFolderName);
aFTP.List(LList, '', false);
while LList.IndexOf('.') > -1 do LList.Delete( LList.IndexOf('.') );
while LList.IndexOf('..') > -1 do LList.Delete( LList.IndexOf('..') );
for i := 0 to LList.Count - 1 do
begin
if aFTP.Size( LList[i] ) = -1
then RecursiveFileDelete( aFTP, LList[i] )
else aFTP.Delete( LList[i] );
end;
aFTP.ChangeDirUp;
aFTP.RemoveDir( aFolderName );
finally
LList.Free;
end;
end;
var
LIdFTP : TIdFtp;
begin
LIdFTP := TIdFtp.Create(nil);
With LIdFTP do
try
Host := aHost;
Username := aUsername;
Password := aPassword;
Connect();
if Connected then
RecursiveFileDelete( LIdFTP, aRemotePath );
finally
LIdFtp.Free;
end;
end;
Kullanımı :
procedure TForm1.Button1Click(Sender: TObject);
begin
FTPDirectoryRemove( '45.158.12.xxx', '/armanpro.com/css2/', 'loginname', 'password' );
end;
bende aşağıdaki gibi bir işlem ile sildiriyorum. Yalnız ftp ana dizinde içiçe en fazla 3 klasör olacak şekilde izin veriyorum. Bu sefer dosyaların silinmesi daha hızlı oluyor gibi.
procedure TFBulutYedekleme.DosyaSil(DosyaAdi:string);
var
DosyaYolu,AktifDizin:string;
Dosya1,Dosya2,Dosya3:TStrings;
i1,i2,i3: Integer;
vItem: TListItem;
vStrList: TStringList;
begin
if IdFTP1.RetrieveCurrentDir='/' then
begin
DosyaYolu :='/'+DosyaAdi;
AktifDizin:='/';
end
else
begin
DosyaYolu :=IdFTP1.RetrieveCurrentDir+'/'+DosyaYolu;
AktifDizin:=IdFTP1.RetrieveCurrentDir;
end;
Dosya1:=TStringList.Create;
Dosya2:=TStringList.Create;
Dosya3:=TStringList.Create;
IdFTP1.ChangeDir(DosyaYolu); ShowMessage(DosyaYolu);
IdFTP1.List(dosya1,'',false);
for i1 := 0 to Dosya1.Count -1 do
begin
if IconBul(Dosya1[i1])<>4 then IdFTP1.Delete(Dosya1[i1])
else
begin
IdFTP1.ChangeDir(DosyaYolu+'/'+Dosya1[i1]);
IdFTP1.List(Dosya2,'',false);
for i2 := 0 to Dosya2.Count -1 do
begin
if IconBul(Dosya2[i2])<>4 then IdFTP1.Delete(Dosya2[i2])
else
begin
IdFTP1.ChangeDir(DosyaYolu+'/'+Dosya1[i1]+'/'+Dosya2[i2]);
IdFTP1.List(Dosya3,'',false);
for i3 := 0 to Dosya3.Count -1 do
begin
IdFTP1.Delete(Dosya3[i3]);
end;
IdFTP1.ChangeDir(DosyaYolu+'/'+Dosya1[i1]);
IdFTP1.RemoveDir(Dosya2[i2]);
end;
end;
IdFTP1.ChangeDir(DosyaYolu);
IdFTP1.RemoveDir(Dosya1[i1]);
end;
end;
IdFTP1.ChangeDir(AktifDizin);
IdFTP1.RemoveDir(DosyaAdi);
Dosya1.Free;
Dosya2.Free;
Dosya3.Free;
end;