Gerd Kayser - Mi 06.02.13 13:59
Titel: FTP - nur die ersten 4096 Bytes einer Datei übertragen
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:
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 end; end;
procedure TMainForm.IdFTP1Status(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string); begin Label1.Caption := AStatusText; Label1.Update; end;
procedure TMainForm.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64); begin if AWorkCount > 4095 then IdFtp1.KillDataChannel; 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 - 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.
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 end;
Mem.Size := 4096; Mem.Position := 0; if FileExists(Ziel) then DeleteFile(Ziel); Mem.SaveToFile(Ziel); finally Mem.Free; end; end; |