2012-06-19 11 views
5

Quiero encontrar una manera de copiar un archivo en varias ubicaciones simultáneamente (con C#).Cómo copiar un archivo en muchas ubicaciones simultáneamente

significa que no quiero que el archivo original se lea solo una vez, y que "pegue" el archivo en otras ubicaciones (en la red local).

tan lejos como mis pruebas me mostraron, el

File.Copy() 

se lea siempre la fuente de nuevo.

y por lo que tengo entendido, incluso cuando se utiliza la memoria, esa pieza de memoria se bloquea.

básicamente, quiero imitar el "copiar y pegar" en la forma de una "copia", y varias "pegar", sin volver a leer desde el disco duro otra vez.

¿Por qué? porque eventualmente, necesito copiar una carpeta (más de 1GB) en muchas computadoras, y el cuello de botella es la parte que necesito para leer el archivo fuente.

Entonces, ¿Es posible de lograr?

+2

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

+1

¿Está teniendo un problema con eso, simplemente siendo científico o simplemente optimizando prematuramente su código? – ivowiblo

+0

@ivowiblo: estoy tratando de optimizar un proceso que toma 2 horas (15 minutos para 10 computadoras). Estoy seguro de que hay una forma mejor de la copia "normal". – itsho

Respuesta

9

En lugar de utilizar el método File.Copy utilidad, puede abrir el archivo de origen como FileStream, a continuación, abrir tantas FileStreams que sin embargo muchos archivos de destino que necesita, leídos de la fuente, y escribir en cada flujo de destino.

ACTUALIZACIÓN Se ha modificado para escribir archivos utilizando Parallel.ForEach para mejorar el rendimiento.

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); 
            } 
           } 

          }); 
    } 
} 

Uso:

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

¡Genial! Lo intentaré, y probablemente marque como respondí. – itsho

+0

Lo probé hoy, pero todavía es lento (1480 archivos, un total de 10MB, para dos computadoras, me llevó unos 4 minutos). tenga en cuenta que su respuesta HIZO solo para leer una vez, pero aún así, no perdonó el tiempo. Lo perfilaré mañana, y lo haré con una mejor respuesta. de todos modos, estoy considerando que Threads haga una copia paralela ... – itsho

+0

De hecho, lee el archivo solo una vez, pero escribe la transmisión un archivo a la vez. Tal vez la API de programación paralela puede ayudar con esto. Veré si puedo volver a trabajar mi respuesta para usar eso. – HackedByChinese

Cuestiones relacionadas