Newsgroup: it.comp.lang.delphi
Titolo: Trasferimento file

Salve a tutti.
Ho sviluppato un'applicazione con delphi 2010.
L'applicativo(chiamiamolo Client) gira su un pc sempre acceso.
Sul pc dell'applicativo è installato ThighVNC sulla porta 5900 e c'è
un'altra porta aperta la 5901 in TCP.
Riesco ad aprire VNC con controllo remoto.
Ho messo un componente Indy TCPServer nell'applicativo con Defaultport
5901 u TIdCommandHandler.
Su un altro applicativo(chiamiamolo server) ho messo il componente
TCPClient anch'esso settato sulla stessa porta.
In effetti la cosa funziona perchè se faccio SendMessage l'applicativo
Client risponde.
Questo perchè è richiesto che l'aggiornamento lo deve chiedere il
server.
Spero di aver descritto bene lo scenario.
Per trasferire i file di aggiornamento quale strategia mi conviene
usare?
Si possono trasferire file PDF e binari con TCPServer e TCPClient di
Indy?
Non ho trovato nessun esempio con Indy 10.5
Grazie

Con la swit Indy per ricevere e/o trasmettere un file binario (vale per 
tutti i tipi di file comunque) uso con successo queste funzioni:
Function Ricevi_File(      IOHandler : TIdIOHandler;
                      Const Directory : String) : String;
Var
   Dir      : String;
   FStream  : TFileStream;
   FileName : String;
Begin
   // -----------------------
   // Settaggio direttorio
   // -----------------------
   Dir := IncludeTrailingPathDelimiter(Directory);
   Try
     // -----------------------
     // Ricezione nome file
     // -----------------------
     FileName := IOHandler.ReadLn;
     // -----------------------
     // Ricezione dati file
     // -----------------------
     FStream  := TFileStream.Create(Dir+FileName, fmCreate, fmOpenWrite);
     IOHandler.LargeStream := True;
     IOHandler.ReadStream(FStream, -1);
     FreeAndNil(FStream);
     // -----------------------
     // In uscita nome file completo
     // -----------------------
     Result := Dir+ExtractFileName(FileName);
   Except
     Result := '';
   End;
End;
Function Invia_File(      IOHandler : TIdIOHandler;
                     Const FileName  : String) : Boolean;
Var
   FStream : TFileStream;
Begin
   Try
     // -----------------------
     // Inizializzazione stream
     // -----------------------
     FStream := TFileStream.Create(FileName, fmOpenRead, fmShareDenyWrite);
     // -----------------------
     // Invio nome file
     // -----------------------
     IOHandler.WriteLn(ExtractFileName(FileName));
     // -----------------------
     // Invio dati file
     // -----------------------
     IOHandler.LargeStream := True;
     IOHandler.Write(FStream, 0, True);
     // -----------------------
     // Finalizzazione stream
     // -----------------------
     FreeAndNil(FStream);
     Result := True;
   Except
     Result := False;
   End;
End;
spero ti siano di aiuto.
David

 TCPClient anch'esso settato sulla stessa porta.
Sull'applicativo che chiami Client metti il componente server e
sull'applicativo che chiami Server metti il componente client? Mi sa che
hai le idee un po' confuse. Spiega la tua esigenza di partenza, non come
hai cercato di risolverla.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Con la swit Indy [...]
La "swit"? 



e dai....
sar� suite ! 


Ok ok ho toppato ed alla grande (fretta, sonno e lunedi')


Devo copiare dei file:
Sorgente server nt;
Destinazione client su xp.
I'applicazione server invia il segnale (messaggio di start),
l'applicazione client riceve lo start  e riceve i file.
Poi il client li elabora e rimanda all'applicativo server un messaggio
di ok o di errore.
..Ho messo un componente Indy TCPServer nell'applicativo con
Defaultport
5901 u TIdCommandHandler.
Su un altro applicativo(chiamiamolo server) ho messo il componente
TCPClient anch'esso settato sulla stessa porta.
...
con questo ho voluto testare che applicativo client e quello server
comunicano tra loro, ho pensato che è il server che manda lo start
quindi ho messo TCPClient sull'applicazione server. Sbagliato?
Grazie.

 David
Grazie David le tue procedure funzionano.
Volevo chiederti:
Supponiamo che chi riceve voglia rifiutare un file senza scaricarlo,
si potrebbe scaricarlo e poi eliminarlo, ma voglio evitare ciò.
In altre parole se il file è gia presente non voglio scaricarlo anche
se viene inviato dalla procedura Invia_File.
Ciao e grazie

 quindi ho messo TCPClient sull'applicazione server. Sbagliato?
S�. 
Sul client, per logica, devi metterci il TCPClient. Sul server il
TCPServer. Il client si registra inizialmente presso il server, quindi
resta in attesa di un messaggio sulla connessione.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 


 questo articolo e` stato inviato via web dal servizio gratuitohttp://
www.newsland.it/newssegnala
 gli abusi ad 
ab...@newsland.it
Grazie

 se viene inviato dalla procedura Invia_File.
In questo caso devi spezzare la procedura in questa maniera:
Invii il nome del file da scaricare ed attendi una risposta (per esempio 
'SI' o 'NO')
in caso di risposta affermativa mandi il file
ovviamente, dall'altra parte, ricevi il nome del file, mandi la risposta 
e, nel caso fosse affermativa, chiami la procedura per ricevere il file
semplice no?


Ho fatto così:
1 - l'applicazione server crea l'elenco completo dei file
2 - l'applicazione server richiede all'applicazione client l'elenco
dei file presenti su di esso
3 - l'applicazione client crea l'elenco e lo invia al server
4 - l'applicazione server ricevuto 'lelenco lo confronta con il prprio
ed elimina da tutti e due i file uguali
5 - ora l'applicazione server ha due elenchi nel primo ci sono i file
che non sono presenti sul client (quindi li deve inviare)
     nel secondo elenco ci sono i file che sono presenti sul client e
che vanno eliminati
6 - l'applicazione server salva i due elenchi in due file di testo
(Copiare.txt ed Eliminare.txt)
7 - l'applicazione server aggiunge al file Copiare.txt la riga
Eliminare.txt ed elimina il Eliminare.txt
8 - l'applicazzione server invia tutti i file contenuti in copiare.txt
al client ed elimina il file Copiare.txt
9 - l'applicazione client riceve tutti i file ed elimina i file
contenuti in Eliminare.txt dal client
Funziona.
P.S.: i nomi dei file in questione sono del tipo
NumeroCliente_NumeroTipo_NumeroRevisione.pdf
        In questo modo non ci sono problemi di revisione.
Grazie a tutti per l'aiuto e la disponibilità.

haidomingo ha scritto:
<...>
Avresti potuto risolvere tutto in maniera molto pi� semplice lasciando che
il client inviasse un'autorizzazione all'upload al server. Il serve gli
avrebbe risposto con un s� o con un no e il client, in caso di risposta
affermativa, avrebbe proceduto all'upload.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 


 affermativa, avrebbe proceduto all'upload.
Sono pienamente daccordo con Andrea anche perche' se tra un annetto 
rimetterai le mani al programma ti ci vorra' un bel po' a capire perche' 
hai fatto quello che hai fatto

E' possibile aggiungere un echo (su label o su progressbar) al
trasferimento mediante ReadStrem e  WriteStream sia sul server che sul
client?
Grazie



Con i componenti Indy � possibile avere un feedback continuo mediante
eventi OnWorkBegin/OnWorkProgress/OnWorkEnd.