![]() |
Problem mit TFileStream und Indy TidStreamVCL
Hallo,
ich will eine Datei über eine TidTCPClient bzw. -Server verschicken. Hierbei sei gleich gesagt: Es funktioniert. Aber: Nur weil ich einen try-except-Block ohne Ereignis bei except eingebaut habe. Sonst würde beim Client eine Meldung erscheinen: "Fehler | Stream-Fehler", auch der Server würde einfach an der Stelle stoppen. Hier der Code:
Delphi-Quellcode:
Das wär's. So funktioniert es. Aber ohne try...except würde eben der Fehler auftreten. Woran könnte es liegen?
// Client
procedure TSendeForm.DateiSenden; var FStream : TFileStream; IDS : TidStreamVCL; begin StatusText.Caption := 'Client: Bereit zur Datenübertragung, Sende...'; TCPSender.Host := host; // String, vorher eingegeben FStream := TFileStream.Create(DateiName, fmOpenRead); IDS := TidStreamVCL.Create(FStream); // Ein Indy-Stream muss bei create ein TStream übergeben werden try IDS.VCLStream.CopyFrom(FStream, FStream.Size); // Hier kommt der Fehler im Client (wenn nicht in try...except) except { Nichts! } end; with TCPSender do begin Connect; try Socket.Write(IDS, 0, true); finally StatusText.Caption := 'Fertig, warte auf Bestätigung...'; Disconnect; end; end; FStream.Free; IDS.Free; end; // Server procedure TEmpfangsForm.TCPReceiverExecute(AContext: TIdContext); var FStream : TFileStream; SizeOfIncomingStream : Integer; IDS : TidStreamVCL; begin FStream := TFileStream.Create(DateiName, fmCreate); IDS := TidStreamVCL.Create(FStream); SizeOfIncomingStream := AContext.Connection.Socket.ReadInteger; AContext.Connection.Socket.ReadStream(IDS, SizeOfIncomingStream); AContext.Connection.Disconnect; try FStream.CopyFrom(IDS.VCLStream, IDS.VCLStream.Size); // auch hier würde der Fehler auftreten except { Nichts } end; FStream.Free; IDS.Free; // (Weitere Behandlung der Datei) end; Danke, Manuel |
Re: Problem mit TFileStream und Indy TidStreamVCL
was denn für ein fehler?
eventuell würde es ja nach dem IDS.CopyFrom reichen dessen position auf 0 zu setzen bevor du ihn sendest |
Re: Problem mit TFileStream und Indy TidStreamVCL
Das Problem macht ja der Aufruf von CopyFrom:
[Meldung mit rotem X, Überschrift=Titel meines Programms] Stream-Schreibfehler! Wenn ich, wie im Beispiel, copyFrom in try...except setzte, funktioniert es. |
Re: Problem mit TFileStream und Indy TidStreamVCL
Hi. Also ich denk dir ist klar dass IDS.VCLStream = FStream. Nur was genau ist der Sinn dieser Zeile:
Delphi-Quellcode:
Warum willst du FStream in sich selbst kopieren? Lass die Zeile einfach weg und es sollte funktionieren.
IDS.VCLStream.CopyFrom(FStream, FStream.Size);
|
Re: Problem mit TFileStream und Indy TidStreamVCL
Danke, es funktioniert. Ich habe mir auch schon gedacht, dass es daran liegen könnte.
Aber was ist auf der Server-Seite? Dort werden die Daten ja erst in den Indy-Stream geschrieben. Wenn ich es da weglasse, ist die Datei (aus dem FStream) leer. ![]() |
Re: Problem mit TFileStream und Indy TidStreamVCL
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht liegt es daran, wie du den Stream auf Serverseite ausließt, versuch mal
Delphi-Quellcode:
// Server
procedure TEmpfangsForm.TCPReceiverExecute(AContext: TIdContext); var FStream : TFileStream; IDS : TidStreamVCL; begin FStream := TFileStream.Create(DateiName, fmCreate or fmShareDenyWrite); IDS := TidStreamVCL.Create(FStream, true); try AContext.Connection.Socket.ReadStream(IDS); AContext.Connection.Disconnect; IDS.Position := 0; // (Weitere Behandlung des File-Streams) finally IDS.Free; end; // (Weitere Behandlung der Datei) end; |
Re: Problem mit TFileStream und Indy TidStreamVCL
Danke erst mal!
So wie im Code-Beispiel funktioniert es nicht. Aber das Beispiel im Anhang werde ich mir mal ansehen. Vielleicht liegt es daran, dass ich FStream gleich als TFileStream und nicht als TStream definiere. Hier noch mal die neueste Version des Codes:
Delphi-Quellcode:
Mal sehen... :spin2:
// Client
procedure TSendeForm.DateiSenden; var FStream : TFileStream; IDS : TidStreamVCL; begin TCPSender.Host := Host; FStream := TFileStream.Create(DateiName, fmOpenRead); IDS := TidStreamVCL.Create(FStream); with TCPSender do begin Connect; try Socket.Write(IDS, 0, true); finally Disconnect; end; end; FStream.Free; IDS.Free; end; // Server procedure TEmpfangsForm.TCPReceiverExecute(AContext: TIdContext); var FSTream : TFileStream; SizeOfIncomingStream : Integer; IDS : TidStreamVCL; begin FStream := TFileStream.Create(DateiName, fmCreate); IDS := TidStreamVCL.Create(FStream); with AContext.connection do begin try SizeOfIncomingStream := Socket.ReadInteger; Socket.ReadStream(IDS, SizeOfIncomingStream); finally Disconnect; end; end; try FStream.CopyFrom(IDS.VCLStream, IDS.VCLStream.Size); except // Nichts end; FStream.Free; IDS.Free; // (Weitere Behandlung der Datei) end; |
Re: Problem mit TFileStream und Indy TidStreamVCL
Delphi-Quellcode:
So funktioniert es endlich :mrgreen:
// Server
procedure TEmpfangsForm.TCPReceiverExecute(AContext: TIdContext); var FSTream : TFileStream; SizeOfIncomingStream : Integer; IDS : TidStreamVCL; begin FStream := TFileStream.Create(DateiName, fmCreate); IDS := TidStreamVCL.Create(FStream); with AContext.connection do begin try SizeOfIncomingStream := Socket.ReadInteger; Socket.ReadStream(IDS, SizeOfIncomingStream); finally Disconnect; end; end; IDS.VCLStream.Position := 0; FStream.Free; IDS.Free; // (Weitere Behandlung der Datei) end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz