Newsgroup: it.comp.lang.delphi
Titolo: Problema di copia fra due file

Ciao a tutti,
ho scritto questa funzione per la copia di un file sorgente in uno di 
destinazione, ponendo la massima attenzione alla gestione delle eccezioni:
  Function CopyFile (FileSource, FileDest: AnsiString; Action: Boolean): 
Integer;
    Var Err: Integer;   Source, Dest: TFileStream;  Buffer: Array [0..255] 
Of  Byte;
    Begin
      Err := 0;
      If FileExists (FileDest) Then Err := 100 Else
        Begin
          Try
            Source := TFileStream.Create (FileSource, fmOpenRead);
            Try
              Source.Read (Buffer, Source.Size);
              Try
                Dest := TFileStream.Create (FileDest, fmCreate);
                Try
                  Dest.Write (Buffer, Source.Size);
                Finally
                  Dest.Free;
                End;
              Except
                On Exception Do Err := 102;
              End;
            Finally
              Source.Free;
            End;
          Except
            On Exception Do Err := 101;
          End;
        End;
      CopyFile := Err;
    End;
Mi succede che viene creato il file di destinazione ma non viene effettuata 
la copia, come mai? Cosa ho sbagliato?
Sarei grato se potreste aiutarmi nel comprendere l'errore.
In attesa vi ringrazio e vi auguro una buona pasqua.
Cooper. 

 In attesa vi ringrazio e vi auguro una buona pasqua.
ricambio
A.


perchè non devo effettuare la copia esatta del file, tra la lettura e la 
scrittura del file devo applicare una ulteriore funzione che elabori i dati 
letti e quindi dopo averli elaborati li scriva.
Cooper. 

Nascondere i msg delle eccezioni e' una PESSIMA POLITICA.
Se prp non vuoi mostrarli all'utente, loggali in un file.
Magari li scrivi dentro una tstringlist che poi salvi su un file di log.
Cosi come e' scritta, non potrai MAI capire cosa non funziona.
A.

 ha scritto nel messaggio 
news:e1tvfe$2d7e$1...@newsreader2.mclink.it...

Chi ha detto che devo nasconderli??? Posso chiederti di rispondere alla mia 
domanda? Senza andare oltre....  Riepilogando:
Obiettivo: effettuare la copia di un file.
Problema: Viene creato il file destinazione, ma non viene effettuata la 
copia
Domanda: Perchè?
Semplifico in questo modo (il problema rimane ugualmente):
  Procedure CopyFile (FileSource, FileDest: AnsiString);
    Var Source, Dest: TFileStream;  Buffer: Array [0..255]  Of  Byte;
    Begin
       Source := TFileStream.Create (FileSource, fmOpenRead);
       Source.Read (Buffer, Source.Size);
            Dest := TFileStream.Create (FileDest, fmCreate);
            Dest.Write (Buffer, Source.Size);
            Dest.Free;
       Source.Free;
    End;
Per favore puoi rispondere adesso alla domanda?
Grazie ancora,
Cooper. 

 la copia, come mai? Cosa ho sbagliato?
Sicuramente, un errore è individuabile nel punto in cui leggi i dati dal 
file per memorizzarli all'interno del buffer: chiami il metodo /Read/ 
passando come parametri il Buffer stesso e, come "quantità" di dati da 
leggere, il valore della proprietà /Size/ dello stream di lettura che, 
ovviamente, non avendo letto alcun dato, vale 0, con l'esito che nessun 
dato viene prelevato dallo stream, tantomeno quindi ne verranno scritti 
nel file di destinazione.
In secondo luogo, sei sicuro che la lunghezza del buffer (255 caratteri) 
sia sufficiente per ospitare i dati da caricare? In caso contrario, 
rischi errori anche in questo punto. Secondo me, è opportuno allocare un 
buffer più ampio e più sicuro, sfruttando il valore di ritorno di /Read/ 
per sapere effettivamente quanti byte sono stati letti dallo stream, 
cioè dal file.
E' possibile che vi siano altre correzioni da fare in seguito, a seconda 
dei dati che devi "smistare". Fai riferimento alla Guida per conoscere 
come utilizzare i metodi delle classi che derivano da *TStream*.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)


Ok grazie, seguirò il consiglio.
Cooper. 

 Dubbio: se ho allora un file da 2 gb viene copiato in un sol colpo?
Se il file è da 2GB e la proprietà /Size/ è quindi inizializzata a 2GB, 
quando la passi al metodo /Read/ indichi la tua intenzione di leggere 
2GB di dati; se li riponi in un buffer da 256 byte, credo che questo 
possa costituire un piccolissimo problema. :-)


 domanda? Senza andare oltre....  Riepilogando:
NON MAI DETTO CHE *DEVI*NASCONDERLI.
QUELLO CHE HO DETTO E' CHE *LO STAI FACENDO* E CHE *NON DOVRESTI FARLO*
A.


Uhm mi rocrdano le istruzioni: blockread, blockwrite, a questo punto mi sa 
che viene piu semplice ricorrere a queste ultime due.
Quale differenza intercorre a livello di velocità fra le due? Intendo fra la 
copia mediante l'oggetto tfilestream e le istruzioni: blockread/blockwrite?
Grazie mille delle delucidazioni, ne terrò conto :)
Cooper.

 copia mediante l'oggetto tfilestream e le istruzioni: blockread/blockwrite?
Non ho mai fatto confronti di prestazioni tra queste due soluzioni, ma 
non penso vi siano grosse differenze.
Devi "maneggiare" un file da pochi Kb, da quanto ho capito, hai 
imbastito un sistema di gestione degli errori un po' dubbio, non hai ben 
chiaro l'uso del metodo /Read/ per gli stream... non sarà mica la 
differenza in decimillesimi di secondo rispetto alle procedure di 
lettura/scrittura blocchi a darti fastidio, no? ;-)


 Cooper. 
Andrea


Ok grazie mille qui è molto chiaro :)
Provo a gestire meglio la funzione. :)
Cooper. 

 ha scritto nel messaggio 
news:44434513$0$36931$4faf...@reader3.news.tin.it...

Grazie mille, terrň conto di questa strada :)
Cooper.