AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem mit TFileStream und Indy TidStreamVCL
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit TFileStream und Indy TidStreamVCL

Ein Thema von ManuMF · begonnen am 29. Jul 2005 · letzter Beitrag vom 14. Aug 2005
Antwort Antwort
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#1

Problem mit TFileStream und Indy TidStreamVCL

  Alt 29. Jul 2005, 12:53
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
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#2

Re: Problem mit TFileStream und Indy TidStreamVCL

  Alt 29. Jul 2005, 13:16
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
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#3

Re: Problem mit TFileStream und Indy TidStreamVCL

  Alt 29. Jul 2005, 15:00
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.
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Problem mit TFileStream und Indy TidStreamVCL

  Alt 29. Jul 2005, 15:27
Hi. Also ich denk dir ist klar dass IDS.VCLStream = FStream. Nur was genau ist der Sinn dieser Zeile:
IDS.VCLStream.CopyFrom(FStream, FStream.Size); Warum willst du FStream in sich selbst kopieren? Lass die Zeile einfach weg und es sollte funktionieren.
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#5

Re: Problem mit TFileStream und Indy TidStreamVCL

  Alt 30. Jul 2005, 12:34
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
  Mit Zitat antworten Zitat
Benutzerbild von Dani
Dani

Registriert seit: 19. Jan 2003
732 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Problem mit TFileStream und Indy TidStreamVCL

  Alt 30. Jul 2005, 13:38
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;
Angehängte Dateien
Dateityp: zip sendstream_177.zip (6,2 KB, 34x aufgerufen)
Dani H.
At Least I Can Say I Tried
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#7

Re: Problem mit TFileStream und Indy TidStreamVCL

  Alt 31. Jul 2005, 22:48
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...
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#8

Re: Problem mit TFileStream und Indy TidStreamVCL

  Alt 14. Aug 2005, 16:18
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:14 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