File.Copy vs. Manual FileStream.Write para copiar archivos
Mi problema es en lo que respecta al rendimiento de copia de archivos. Tenemos un sistema de administración de medios que requiere una gran cantidad de archivos que se mueven en el sistema de archivos a diferentes ubicaciones, incluidas las redes compartidas de Windows en la misma red, sitios FTP, AmazonS3, etc. System.IO.File.Copy (origen, destino) para copiar un archivo. Ya que muchas veces todo lo que tenemos es un flujo de entrada (como un MemoryStream), intentamos abstraer la operación de Copia para tomar un flujo de entrada y un flujo de salida, pero estamos viendo una disminución masiva del rendimiento. A continuación hay un código para copiar un archivo para usarlo como punto de discusión.
public void Copy(System.IO.Stream inStream, string outputFilePath)
{
int bufferSize = 1024 * 64;
using (FileStream fileStream = new FileStream(outputFilePath, FileMode.OpenOrCreate, FileAccess.Write))
{
int bytesRead = -1;
byte[] bytes = new byte[bufferSize];
while ((bytesRead = inStream.Read(bytes, 0, bufferSize)) > 0)
{
fileStream.Write(bytes, 0, bytesRead);
fileStream.Flush();
}
}
}
¿Alguien sabe por qué esto se realiza mucho más lento que File.Copy? ¿Hay algo que pueda hacer para mejorar el rendimiento? ¿Tendré que poner una lógica especial para ver si estoy copiando de una ubicación de Windows a otra, en cuyo caso solo usaría File.Copy y en los otros casos usaré las secuencias?
Por favor, hágame saber lo que piensa y si necesita información adicional. He intentado diferentes tamaños de búfer y parece que un tamaño de búfer de 64k es óptimo para nuestros archivos "pequeños" y 256k + es un mejor tamaño de búfer para nuestros archivos "grandes", pero en cualquier caso tiene un rendimiento mucho peor que File.Copy ( ). ¡Gracias por adelantado!