Newsgroup: it.comp.lang.delphi
Titolo: Invio File con IDTCP

Salve a tutti, sto facendo un programma utilizzando i componenti indy
TCP, ma data la mia ignoranza in materia coi conseguenti scarsi
risultati, mi rivolgo a voi... in sostanza il mio scopo è inviare file
da idtcpclient a idtcpserver, ho cercato molto in internet e il mio
risultato è tutto qua:
//LATO CLIENT
fl:=TMemoryStream.Create;
fl.LoadFromFile(nomefile);
client.WriteInteger(fl.Size);
client.readln;
try
    client.OpenWriteBuffer;
    client.WriteStream(fl);
    client.CloseWriteBuffer;
finally
    FreeAndNil(fl);
end;
//LATO SERVER
fl := TFileStream.Create(nomefile,fmCreate);
dimensione := AThread.Connection.ReadInteger;
AThread.Connection.WriteLn('ok');
try
   AThread.Connection.ReadStream(fl,-1,false);
finally
   FreeAndNil(fl);
end;
il codice l'ho provato con un file rar di circa 200KB
il risultato tanto sperato c'è stato, ma solo parzialmente, infatti
l'applicazione server durante la ricezione mi crea un file che si
aggira attorno ai 200 mega e lo tiene aperto fino a che non
disconnetto il client, a quel punto il file  viene chiuso e passa ad
una dimensione di circa 700KB rispetto ai 200KB dell'originale,
successivamente sono andato a controllare il file ricevuto e l'ho
aperto per vedere che faceva... funzionava (ho anche estratto tutti i
file), solo che mi dava crc corrotto e fine archivio inaspettata, ne
ho concluso quindi che il file ricevuto ha solamente dei byte in più
in coda e gli altri corrispondono al file sorgente...
dimenticavo di dire che il server si blocca all'istruzione
AThread.Connection.ReadStream(fl,-1,false);
 in sostanza le mie domande sono queste:
-come faccio a chiudere il file senza disconnettere il client?
-c'è un motivo valido per cui il file ricevuto ha dei byte aggiuntivi
rispetto al file originale?
-come posso risolvere questo problema?
qualunque suggerimento è ben accetto... se non sn stato chiaro
ditemelo...
grazie, Andrea

Personalmente uso, e con successo, le seguenti:
Procedure Invia_File(      IOHandler : TIdIOHandler;
                      Const FileName  : String);
Var
   FStream : TFileStream;
Begin
   FStream := TFileStream.Create(FileName, fmOpenRead, fmShareDenyWrite);
   IOHandler.WriteLn(ExtractFileName(FileName));
   IOHandler.LargeStream := True;
   IOHandler.Write(FStream, 0, True);
   FreeAndNil(FStream);
End;
Function Ricevi_File(      IOHandler : TIdIOHandler;
                      Const Directory : String) : String;
Var
   Dir      : String;
   FStream  : TFileStream;
   FileName : String;
Begin
   Dir := Directory;
   If Copy(Dir, Length(Dir), 1) <> '\' Then Dir := Dir + '\';
   FileName              := IOHandler.ReadLn;
   FStream               := TFileStream.Create(Dir+FileName, fmCreate, 
fmOpenWrite);
   IOHandler.LargeStream := True;
   IOHandler.ReadStream(FStream, -1);
   FreeAndNil(FStream);
   Result := FileName;
End;
Dove Invia_Fine trasmette il file FileName ed Ricevi_File riceve un file 
nella directory Directory e ritorna il nome completo del file ricevuto.
Nota: Occhio che e' buona norma settare a True la proprieta' LargeStream 
per ovviare a problemi
Ciao

ti ringrazio! finalmente dopo mesi di fatica il file è passato :),
grazie mille! funziona tutto a meraviglia

 ti ringrazio! finalmente dopo mesi di fatica il file è passato :),
grazie al codice di microges?
In tal caso, sono 40 euro/ora per l'assistenza..
:-P
!!
-- 
Morde


se la mettiamo così credo che sia stato semplicemente un miracolo :)

End;
Imparate ad usare i try...finally.

> Imparate ad usare i try...finally.
Ok Ok su questo hai pienamente ragione

> Imparate ad usare i try...finally.
vabbè, a quel codice qualche modifica l'ho fatta e tra queste c'erano
pure i try finally :)