Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit TFileStream und Indy TidStreamVCL (https://www.delphipraxis.net/50672-problem-mit-tfilestream-und-indy-tidstreamvcl.html)

ManuMF 29. Jul 2005 11:53


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:
// 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;
Das wär's. So funktioniert es. Aber ohne try...except würde eben der Fehler auftreten. Woran könnte es liegen?

Danke,
Manuel

barf00s 29. Jul 2005 12:16

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

ManuMF 29. Jul 2005 14:00

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.

Dani 29. Jul 2005 14:27

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:
IDS.VCLStream.CopyFrom(FStream, FStream.Size);
Warum willst du FStream in sich selbst kopieren? Lass die Zeile einfach weg und es sollte funktionieren.

ManuMF 30. Jul 2005 11:34

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.http://forum.overnet.com/images/smiles/eusa_think.gif

Dani 30. Jul 2005 12:38

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;

ManuMF 31. Jul 2005 21:48

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:
// 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;
Mal sehen... :spin2:

ManuMF 14. Aug 2005 15:18

Re: Problem mit TFileStream und Indy TidStreamVCL
 
Delphi-Quellcode:
// 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;
So funktioniert es endlich :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz