TIdFTP - buforowanie strumienia

0

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.

2

jeśli nie chcesz na dysk to możesz do pamięci ale ściągnąć go musisz w ten czy inny sposób

0

Czy ten Indy potrafi przesyłać plik do bufora w RAMie?

1
Markoni napisał(a):

Czy ten Indy potrafi przesyłać plik do bufora w RAMie?

Potrafi.

0
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.

0

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?

0

Cały przykład z plikiem tekstowym Sprawdzone działa. Pobiera z serwera plik zakodowany w UTF8.

screenshot-20201022224844.png

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.

screenshot-20201022225220.png

1 użytkowników online, w tym zalogowanych: 0, gości: 1