2012-06-19 15 views
5

Desidero trovare un modo per copiare un file in più posizioni contemporaneamente (con C#).Come copiare un file in più posizioni contemporaneamente

significa che non voglio che il file originale venga letto una sola volta e "incolla" il file in un'altra posizione (sulla rete locale).

quanto riguarda i miei test mi ha mostrato, il

File.Copy() 

sarà sempre rileggere la fonte.

e per quanto ho capito, anche durante l'utilizzo della memoria, quel pezzo di memoria viene bloccato.

quindi, in pratica, voglio imitare il "copia-incolla" nella forma di una "copia" e più "incolla", senza riletto dal disco rigido nuovamente.

Perché? perché alla fine, ho bisogno di copiare una cartella (più di 1 GB) su molti computer, e il collo di bottiglia è la parte di cui ho bisogno per leggere il file sorgente.

Quindi, È persino possibile raggiungere?

+2

http://www.java2s.com/Code/CSharp/File-Stream/illustratesuseofMemoryStreams.htm? – Holystream

+1

Hai un problema con questo, stai solo facendo scienza o ottimizzando prematuramente il tuo codice? – ivowiblo

+0

@ivowiblo: sto cercando di ottimizzare un processo che richiede 2 ore (15 minuti per 10 computer). Sono sicuro che c'è una via migliore dalla copia "normale". – itsho

risposta

9

Invece di utilizzare il metodo File.Copy utility, è possibile aprire il file di origine come un FileStream, quindi aprire il maggior numero di FileStreams tuttavia molti file di destinazione, è necessario leggere dalla fonte, e scrivere ogni flusso destinazione.

UPDATE Modificato per scrivere file utilizzando Parallel.ForEach per migliorare il throughput.

public static class FileUtil 
{ 
    public static void CopyMultiple(string sourceFilePath, params string[] destinationPaths) 
    { 
     if (string.IsNullOrEmpty(sourceFilePath)) throw new ArgumentException("A source file must be specified.", "sourceFilePath"); 

     if (destinationPaths == null || destinationPaths.Length == 0) throw new ArgumentException("At least one destination file must be specified.", "destinationPaths"); 

     Parallel.ForEach(destinationPaths, new ParallelOptions(), 
         destinationPath => 
          { 
           using (var source = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
           using (var destination = new FileStream(destinationPath, FileMode.Create)) 
           { 
            var buffer = new byte[1024]; 
            int read; 

            while ((read = source.Read(buffer, 0, buffer.Length)) > 0) 
            { 
             destination.Write(buffer, 0, read); 
            } 
           } 

          }); 
    } 
} 

Usage:

FileUtil.CopyMultiple(@"C:\sourceFile1.txt", @"C:\destination1\sourcefile1.txt", @"C:\destination2\sourcefile1.txt"); 
+0

Brillante! Farò un tentativo e probabilmente segnerò come risposta. – itsho

+0

L'ho provato oggi, ma è ancora lento (1480 file, 10 MB totali, per due computer - mi ci sono voluti circa 4 minuti). per favore nota che la tua risposta è riuscita a leggere solo una volta, ma comunque non ha risparmiato il tempo. Lo descriverò domani, e tornerò con una risposta migliore. comunque, sto considerando Thread per fare una copia parallela ... – itsho

+0

Infatti, legge il file solo una volta, ma scrive il flusso di un file alla volta. Forse l'API di programmazione parallela può aiutare con questo. Vedrò se riesco a rielaborare la mia risposta per usarlo. – HackedByChinese

Problemi correlati