arkadaşlar, TnmFTP bileşenini kullanarak ftp ye dosya transferi yapmak istiyorum, yapıyorumda. Yalnız dosyaları ftp de dosyaları farklı klasörlere atıyorum. o yüzden önce ilgili klasörün olup olmadığını kontrol etmek lazım. Onu kontrol edip varsa klasörü değiştiriyorum sonra o klasöre dosyayı gönderiyorum.
Buraya kadar her şey ok. Ancak peşpeşe bir kaç dosya gönderdiğim zaman program takılıyor. log tutturdum.
Program aşağıdaki unitteki prosedürlerden birinde takılıyor. procedurü aşağıda belirttim.
1.Neden böyle bir şey (takılma)yapıyor olabilir.
2.Dosya transfer etmek için aktif klasörü değiştirmem şart mı?
3.Başka nasıl bir yöntem önerirsiniz.
Kod: Tümünü seç
unit UFtpUtils;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Psock, NMFtp;
Function ChangeFtpDir(inftp:TNMFTP; TargetDir:string):Boolean;
implementation
uses ULogs;
Type
TF1 = class
dirlist:Tstrings;
procedure InFtpListItem(Listing: String);
end;
//direk procedure olarak yazınca
//inftp nin onlistitem olayına atıyamadım ondan sebeb clas yaptım.
//NOT: ilk clasım ona göre
var
tempf:TF1;
procedure TF1.InFtpListItem(Listing: String);
var
temp:string;
Function siradakiniver():string;
var
b:integeR;
Begin
b:=pos(' ',temp);
result:=copy(temp,1,b);
Delete(temp,1,b);
temp:=TrimLeft(temp);
End;
begin
temp:=listing;
if (pos('d',siradakiniver)>0)then
begin
siradakiniver;
siradakiniver;
siradakiniver;
siradakiniver;
siradakiniver;
siradakiniver;
siradakiniver;
dirlist.Add(temp);
//logekle('dizin adı > '+temp);
//bu proc. de takılıyor ama herzaman değil.
//sanırım sonsuz bir döngüye giriyor yada öle bişeyler oluyor hata vermiyor.
end;
end;
Function ChangeFtpDir(inftp:TNMFTP; TargetDir:string):Boolean;
var
oldevent:TNMListItem;
Begin
//Logekle(targetdir +' a bakıyoruz');
if tempf=nil then tempf:=tf1.create;
tempf.dirlist:=TStringList.Create;
oldevent:=inftp.OnListItem;
inftp.OnListItem:=tempf.InFtpListItem;
inftp.List;
if tempf.dirlist.IndexOf(targetdir)>0 then
begin
//logekle('gidiyoruz');
inftp.ChangeDir(targetdir);
result:=true;
end else
Begin
//logekle('oluşturuyoruz');
inftp.MakeDirectory(targetdir);
//logekle('gidiyoruz');
inftp.ChangeDir(targetdir);
result:=true;
end;
//logekle('olaylist boşaltılıyor');
inftp.OnListItem:=oldevent;
//freeandnil(tempf.dirlist);
freeandnil(tempf);
End;
end.