File.Copy vs. Manual FileStream.Write Zum Kopieren von Dateien
Mein Problem ist in Bezug auf die Leistung beim Kopieren von Dateien. Wir haben ein Medienverwaltungssystem, bei dem viele Dateien auf dem Dateisystem an verschiedene Speicherorte verschoben werden müssen, einschließlich Windows-Freigaben im selben Netzwerk, FTP-Sites, AmazonS3 usw. Wenn wir uns alle in einem Windows-Netzwerk befanden, konnten wir mit der Verwendung davonkommen System.IO.File.Copy (Quelle, Ziel) zum Kopieren einer Datei. Da wir oft nur einen Eingabestream haben (wie einen MemoryStream), haben wir versucht, den Kopiervorgang zu abstrahieren, um einen Eingabestream und einen Ausgabestream zu erhalten, aber wir bemerken einen massiven Leistungsabfall. Nachfolgend finden Sie einen Code zum Kopieren einer Datei, die als Diskussionspunkt verwendet werden soll.
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();
}
}
}
Weiß jemand, warum dies so viel langsamer als File.Copy führt? Kann ich etwas tun, um die Leistung zu verbessern? Muss ich nur spezielle Logik einbauen, um zu sehen, ob ich von einem Windows-Speicherort zu einem anderen kopiere? In diesem Fall verwende ich einfach File.Copy und in den anderen Fällen verwende ich die Streams.
Bitte lassen Sie mich wissen, was Sie denken und ob Sie zusätzliche Informationen benötigen. Ich habe verschiedene Puffergrößen ausprobiert und es scheint, als wäre eine Puffergröße von 64 KB für unsere "kleinen" Dateien optimal und 256 KB + ist eine bessere Puffergröße für unsere "großen" Dateien - aber in beiden Fällen ist die Leistung viel schlechter als bei File.Copy ( ). Danke im Voraus!