Autor Beitrag
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Mi 06.02.13 13:59 
Hallo,

über FTP möchte ich nur die jeweils ersten 4096 Bytes von mehreren Dateien übertragen. Bislang habe ich das in einer kleinen Testanwendung mit TIdFtp (Indy 10.5.7, Delphi XE) so gelöst:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
procedure TMainForm.Button1Click(Sender: TObject);
begin
  Label1.Caption := '';
  Application.ProcessMessages;

  if not IdFtp1.Connected then
    begin
      IdFtp1.Host := '192.168.1.101';
      IdFtp1.Username := '';
      IdFtp1.Password := '';
      IdFtp1.Passive := true;
      IdFtp1.Connect;
      IdFtp1.ChangeDir('/DataFiles');
    end;

  IdFtp1.TransferType := ftBinary;

  try
    IdFtp1.Get('Der letzte Tempelritter.rec''L:\XXX\Test.REC',true, false);
  except
    on E: exception do
      //   Den geschwätzigen Meldungen den Saft abdrehen.
  end;
end;

procedure TMainForm.IdFTP1Status(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: string);
begin
  Label1.Caption := AStatusText;   // "Transfer abgeschlossen" usw.
  Label1.Update;
end;

procedure TMainForm.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  if AWorkCount > 4095 then  // ---> Dateigröße danach = 33580 Bytes
    IdFtp1.KillDataChannel;  // Disconnect oder Abort führt zu größeren Dateien.
end;


Es handelt sich bei den Dateien um Aufnahmedateien meines Festplattenreceivers. In den Headern steckt die Inhaltsangabe des jeweiligen Films drin. Jede einzelne Datei hat etwa eine Größe von 2 bis 4 GB. Gibt es vielleicht eine elegantere Methode, mein Ziel zu erreichen, als einfach die Übertragung abzuschießen?
Gerd Kayser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Fr 08.02.13 19:41 
Anscheinend gibt es wohl keine elegantere Lösung.

Ich habe es jetzt so gelöst, daß ich einen MemoryStream für die Übertragung nutze, die Übertragung abschieße, wenn mindestens 4096 Bytes übertragen worden sind, und danach die ersten 4096 Bytes des MemoryStreams auf der Platte (vorerst) speichere. Die restlichen Bytes werden verworfen.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
procedure TMainForm.Button1Click(Sender: TObject);
var
  Mem  : TMemoryStream;
  Ziel : string;
begin
  Ziel := 'L:\XXX\Eragon - Das Vermächtnis der Drachenreiter.rec';
  Label1.Caption := '';
  Application.ProcessMessages;

  Mem := TMemoryStream.Create;
  try
    Mem.Position := 0;
    if not IdFtp1.Connected then
      begin
        IdFtp1.Host := '192.168.1.101';
        IdFtp1.Username := '';
        IdFtp1.Password := '';
        IdFtp1.Passive := true;
        IdFtp1.Connect;
        IdFtp1.ChangeDir('/DataFiles');
      end;

    IdFtp1.TransferType := ftBinary;

    try
      IdFtp1.Get('Eragon - Das Vermächtnis der Drachenreiter.rec', Mem, false);
    except
      on E: exception do
        //   Den geschwätzigen Meldungen den Saft abdrehen.
    end;

    Mem.Size := 4096;
    Mem.Position := 0;
    if FileExists(Ziel) then
      DeleteFile(Ziel);
    Mem.SaveToFile(Ziel);
  finally
    Mem.Free;
  end;
end;