Merhaba,
Örnek kullanım şekli prosedür testi için uygun değil idi. Ben aşağıdaki gibi çağırdım prosedürü:
Kod: Tümünü seç
FTP_AKTARIM('ftp://5.2.84.41/deneme/test/sondizin/üğişı/burası', 'karkas', 'Karkas987654', False, 'C:\temp\abc\def\xğiş\yedek\Encoding Time.csv')
Ayrıca prosedürü Delphi'ye aşağıdaki şekilde dönüştürdüm:
Kod: Tümünü seç
procedure TForm1.FTP_AKTARIM(const HOST, KULLANICI_ADI, PAROLA: string; const PasifMod: Boolean; const DOSYA_ADI: string);
var
IdFTP: TIdFTP;
TempString: string;
FtpAdresi: TStringList;
FtpKlasorIcerigi: TStringList;
FtpDizinler: TStringList;
FtpDizinYolu: string;
I: Integer;
begin
IdFTP := TIdFTP.Create(nil);
try
try
IdFTP.Passive := PasifMod;
IdFTP.TransferType := ftBinary;
//FTP Adresini Bölüyoruz
TempString := StringReplace(HOST, 'ftp://', EmptyStr, []);
TempString := StringReplace(TempString, '/', ',', [rfReplaceAll]);
if TempString[TempString.Length] = '/' then SetLength(TempString, TempString.Length - 1);
FtpAdresi := TStringList.Create();
try
FtpAdresi.StrictDelimiter := True;
FtpAdresi.Delimiter := ',';
FtpAdresi.DelimitedText := TempString;
IdFTP.Host := FtpAdresi[0];
IdFTP.Username := KULLANICI_ADI;
IdFTP.Password := PAROLA;
try
IdFTP.Connect();
except
on E: Exception do
begin
ShowMessage('Bağlantı hatası: ' + E.Message);
Exit()
end;
end;
FtpKlasorIcerigi := TStringList.Create();
try
if FtpAdresi.Count > 1 then
begin
for I := 1 to Pred(FtpAdresi.Count) do
begin
if FtpAdresi[I] <> EmptyStr then
begin
try
IdFTP.ChangeDir(FtpAdresi[I]);
except
IdFTP.MakeDir(FtpAdresi[I]);
IdFTP.ChangeDir(FtpAdresi[I]);
end;
end;
end;
FtpDizinYolu := DOSYA_ADI.Substring(Pos(ComputerName(), DOSYA_ADI)-1, DOSYA_ADI.Length - Pos(ComputerName(), DOSYA_ADI)-1);
FtpDizinYolu := ExtractFileName(FtpDizinYolu);
FtpDizinYolu := StringReplace(FtpDizinYolu, '\\', ',', [rfReplaceAll]);
if FtpDizinYolu[FtpDizinYolu.Length] = '\' then SetLength(FtpDizinYolu, FtpDizinYolu.Length - 1);
FtpDizinler := TStringList.Create();
try
FtpDizinler.Delimiter := ',';
FtpDizinler.DelimitedText := FtpDizinYolu;
for I := 0 to Pred(FtpDizinler.Count) do
begin
if FtpDizinler[I] <> EmptyStr then
begin
try
IdFTP.ChangeDir(FtpDizinler[I]);
except
IdFTP.MakeDir(FtpDizinler[I]);
IdFTP.ChangeDir(FtpDizinler[I]);
end;
end;
end;
finally
FtpDizinler.Free();
end;
end;
finally
FtpKlasorIcerigi.Free();
end;
finally
FtpAdresi.Free();
end;
IdFTP.Put(DOSYA_ADI, ExtractFileName(DOSYA_ADI), False);
IdFTP.Disconnect();
except
on E: Exception do
begin
ShowMessage(E.Message);
end;
end;
finally
IdFTP.Free();
end;
end;
Yukarıdaki kod bir hata ile karşılaşmadan yüklemeyi yaptı.
Kod içindeki en önemli değişiklik TIdFTP.List() kullanmak yerine direk TIdFTP.ChangeDir() kullanmak oldu. List komutu hata mesajı vermediği durumlar olabiliyor. Konu hakkında detaylı bilgi için:
https://stackoverflow.com/questions/279 ... nd-makedir
Her ne kadar Türkçe karakter içeren dizin isimleri kullansam da FileZilla ile bakıldığı zaman bu isimler farklı karakterler olarak gözükmektedir. Diğer taraftan yükleme yapılan işletim sistemi üzerinde yine düzgün Türkçe karakterler olarak gözükeceğini düşünüyorum. Sadec FTP iletişimi sırasında doğru şekilde Türkçe karakter gösterilememekte.
Yukarıdaki kodu C++ şekline uyarlayıp deneyebilirsiniz. Çok ciddi bir değişiklik gerekmemekte.
Ancak yanlış anlamadı isem C++ örnek prosedürü FtpAdresi nesnesini Free etmiyor ve hafıza kaçağı oluşuyor. Bunun kontrolü gerekecektir.