Cześć,
Chcę przejrzeć zawartość pliku na serwerze FTP.
Do działania wykorzystuje Indy TIdFTP w Delphi.
Macie pomysł jak to zrobić bez wstępnego ściągania pliku na lokalny dysk?
Pozdrawiam.
Cześć,
Chcę przejrzeć zawartość pliku na serwerze FTP.
Do działania wykorzystuje Indy TIdFTP w Delphi.
Macie pomysł jak to zrobić bez wstępnego ściągania pliku na lokalny dysk?
Pozdrawiam.
jeśli nie chcesz na dysk to możesz do pamięci ale ściągnąć go musisz w ten czy inny sposób
Czy ten Indy potrafi przesyłać plik do bufora w RAMie?
Markoni napisał(a):
Czy ten Indy potrafi przesyłać plik do bufora w RAMie?
A potrafisz czytać dokumentację?
Przecież w niej stoi jak wół:
http://www.e-iter.net/knowledge/indy9/007328.html#000D
Jak widać, analogicznie jest z pobraniem jak i wysłaniem pliku na serwer.
Albo z/do pliku albo z/do strumienia.
Jestem amatorem w programowaniu, więc wolałbym przykłady na których zrozumie działanie.
Jak np. powinien wyglądać zapis pliku z serwera bezpośrednio do Memo?
Cały przykład z plikiem tekstowym Sprawdzone działa. Pobiera z serwera plik zakodowany w UTF8.
unit frmFtpTest;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
IdFTP, Vcl.Buttons;
type
TFTPTest = class(TForm)
btnGetFile: TButton;
IdFTP: TIdFTP;
LOG: TMemo;
btnShow: TBitBtn;
Memo1: TMemo;
procedure btnGetFileClick(Sender: TObject);
procedure IdFTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
procedure IdFTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
procedure IdFTPWork(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
procedure IdFTPConnected(Sender: TObject);
procedure btnShowClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
myStream : TMemoryStream ;
end;
var
FTPTest: TFTPTest;
implementation
{$R *.dfm}
procedure TFTPTest.btnGetFileClick(Sender: TObject);
begin
LOG.Lines.Add( 'Zaczynam' ); Application.ProcessMessages;
idFtp.Host := '*****HOST*********' ;
idFtp.Username := '*****USER*********' ;
idFtp.Password := '**********************' ;
idFtp.Connect;
idFtp.Get( 'zalozenia.txt', myStream ) ;
LOG.Lines.Add( 'GetStart.' ); Application.ProcessMessages ;
end;
procedure TFTPTest.btnShowClick(Sender: TObject);
var
myString : string ;
begin
SetString ( myString, PAnsiChar ( myStream.Memory ), myStream.Size ) ;
Memo1.Text := UTF8Decode ( myString );
end;
procedure TFTPTest.FormCreate(Sender: TObject);
begin
myStream := TMemoryStream.Create();
end;
procedure TFTPTest.FormDestroy(Sender: TObject);
begin
myStream.Free;
end;
procedure TFTPTest.IdFTPConnected(Sender: TObject);
begin
LOG.Lines.Add( 'Connected.' ); Application.ProcessMessages;
end;
procedure TFTPTest.IdFTPWork(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
LOG.Lines.Add( 'Working. ' + intToStr ( AWorkCount ) ) ;Application.ProcessMessages;
end;
procedure TFTPTest.IdFTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
begin
LOG.Lines.Add( 'WorkBegin.' ); Application.ProcessMessages;
end;
procedure TFTPTest.IdFTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
LOG.Lines.Add( 'WorkEnd.' ); Application.ProcessMessages;
end;
end.
Ewentualnie wersja minimalistyczna:
unit frmFtpTest;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
IdFTP, Vcl.Buttons;
type
TFTPTest = class(TForm)
btnGetFile: TButton;
IdFTP: TIdFTP;
btnShow: TBitBtn;
Memo1: TMemo;
procedure btnGetFileClick(Sender: TObject);
procedure btnShowClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
myStream : TMemoryStream ;
end;
var
FTPTest: TFTPTest;
implementation
{$R *.dfm}
procedure TFTPTest.btnGetFileClick(Sender: TObject);
begin
idFtp.Host := '*****HOST*********' ;
idFtp.Username := '*****USER*********' ;
idFtp.Password := '**********************' ;
idFtp.Connect;
idFtp.Get( 'zalozenia.txt', myStream ) ;
end;
procedure TFTPTest.btnShowClick(Sender: TObject);
var
myString : string ;
begin
SetString ( myString, PAnsiChar ( myStream.Memory ), myStream.Size ) ;
Memo1.Text := UTF8Decode ( myString );
end;
procedure TFTPTest.FormCreate(Sender: TObject);
begin
myStream := TMemoryStream.Create();
end;
procedure TFTPTest.FormDestroy(Sender: TObject);
begin
myStream.Free;
end;
end.