Entwickler-Ecke

Internet / Netzwerk - Datei versenden (Indy10) - Dateiname


hibbert - Mo 08.05.06 18:52
Titel: Datei versenden (Indy10) - Dateiname
Hi,
ich habe ein Programm geschrieben, welches einige Dateien verschickt. Es handelt sich aber immer um verschiedene Dateitypen. Nun muss ich beim Empfangen ja den Dateinamen angeben. Kann ich den Dateinamen evtl beim Empfangen mit auslesen?

So versende ich:

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:
procedure tform1.dateiSenden(filename:string);
var fs:tfilestream;
stream:TIdStreamVCL;
begin
with IdTCPClient1 do
  begin
    host:=serverip;
    fs := TFileStream.Create(filename, fmOpenRead or fmShareDenyWrite); //Datei in FileStream einlesen
    stream := TIdStreamVCL.Create(fs,true);
    Connect;  //und Verbindung herstellen
    try
      IOHandler.WriteBufferOpen; //stellt sicher, dass alle Daten versendet werden
      try
        IOHandler.Write(stream, 0, true); {das 2. true ist wichtig!, da es bewirkt, dass die Größe des Streams mittels WriteInteger zuerst verschickt wird}
        IOHandler.WriteBufferClose;
      except
        IOHandler.WriteBufferCancel;
        raise;
      end;
    finally
      Disconnect;
      fs.Free;
    end;
  end;
end;


und so empfange ich:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
  fs: TFileStream;
  stream: TIdStreamVCL;
  SizeOfIncomingStream: integer;
begin
  fs := TFileStream.Create('datei.endung', fmCreate or fmShareExclusive);
  stream := TIdStreamVCL.Create(fs);
  with AContext.Connection do
    try
      SizeOfIncomingStream := IOHandler.ReadInteger; //Größe des Streams empfangen
      IOHandler.ReadStream(stream, SizeOfIncomingStream); //und übergeben
    finally
      Disconnect;
      fs.Free;
    end;
end;


thx hibbert


Narses - Mo 08.05.06 20:12

Moin!

Schau dir mal TStringStream an, ist zwar etwas oversized, der Ansatz, aber damit kannste das dann auf die gleiche Art lösen: Einfach die String-Länge als Integer davor und dann den String als Stream. ;)

cu
Narses


hibbert - Mo 08.05.06 20:34

Hi,
ich habe jetzt diesen Ansatz:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
try
      IOHandler.WriteBufferOpen; //stellt sicher, dass alle Daten versendet werden
      try     // TStringStream
        IOHandler.write('test.txt',8,true);
        IOHandler.Write(stream, 0, true); {das 2. true ist wichtig!, da es bewirkt, dass die Größe des Streams mittels WriteInteger zuerst verschickt wird}
        IOHandler.WriteBufferClose;
      except


In Zeile 4 hoffe ich, dass ich den Dateinamen übermittel und danach die Datei.

Nur wie bekomme ich die Daten beim empfangen wieder auseinander?

hibbert


Narses - Mi 10.05.06 00:17

Moin!

Was du brauchst, nennt man Suche in: Delphi-Forum, Delphi-Library PROTOKOLL, mach dich mal ein bischen schlau darüber. ;)

cu
Narses