Hallo zusammen,
in meinem Projekt möchte ich teilweise sehr viele kleine (ca. 1000 x 500kB) oder auch wenige große Dateien (ca. 1-2 x 2GB) von einem USB-Stick, der als Netzlaufwerk konfiguriert ist, auf die Festplatte des PCs kopieren.
Die Performance des File.Copy-Befehls scheint mir dabei etwas gering zu sein.
Deshalb habe ich auch schon nach anderen Klassen Ausschau gehalten.
Welche davon ist denn (zumindest tendenziell) die schnellste Methode?
Oder gibt es noch andere, die vielleicht noch schneller sind.
Danke und Gruß
Frank
Hallo Frank,
also grundsätzlich ist es ja auch ein Thema mit welchem Durchsatz das entsprechende Laufwerk NETTO arbeitet.
Das Kopieren kleinerer Dateien dauert grundsätzlich länger das als Kopieren von Größeren. Kannst du auch einfach mal leicht im Explorer probieren und die Zeiten vergleichen.
Schau mal hier: File.Copy vs. Manual FileStream.Write For Copying Files
Das fand ich z.B. ganz hilfreich.
.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....
Bei der Menge würde ich evtl auf RoboCopy setzen.
Welche davon ist denn (zumindest tendenziell) die schnellste Methode?
Ich hab damals QuickIO entwickelt, weil ich ähnliche Probleme mit vielen kleinen Dateien und SMB hatte (Projekt ist nicht mehr aktiv, weil es so mit der Zukunft mit .NET Core und .NET 5 nicht funktioniert und man grundlegend neu machen müssten).
Alle deine Drei Varianten verwenden unter der Haube (im Prinzip) den selben Mechanismus. Sie unterscheiden sich eigentlich nur im Overhead.
Die schnellste Variante direkt mit Windows Boardmitteln ist CopyFile aus Win32, was ich auch für QuickIO verwendet habe.
Es gibt keine Möglichkeit direkt von .NET aus mit CopyFile zu arbeiten, ohne zusätzlichen Overhead zu haben, auch File.Copy() hat einen Overhead, der gerade bei vielen kleinen Dateien enorm viel Zeit kostet (Attribute checks etc..).
Bleibt für Dich:
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code