Laden...

Welche Methode die Beste um schnell Dateien zu kopieren?

Erstellt von CrocodileDundee vor 3 Jahren Letzter Beitrag vor 3 Jahren 701 Views
C
CrocodileDundee Themenstarter:in
51 Beiträge seit 2018
vor 3 Jahren
Welche Methode die Beste um schnell Dateien zu kopieren?

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.

  • File.Copy
  • StreamReader/Writer
  • FileStream

Welche davon ist denn (zumindest tendenziell) die schnellste Methode?
Oder gibt es noch andere, die vielleicht noch schneller sind.

Danke und Gruß
Frank

P
57 Beiträge seit 2017
vor 3 Jahren

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....

F
10.010 Beiträge seit 2004
vor 3 Jahren

Bei der Menge würde ich evtl auf RoboCopy setzen.

https://github.com/tjscience/RoboSharp

16.807 Beiträge seit 2008
vor 3 Jahren

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:

  • CopyFile via PInvoke zu verwenden
  • .NET Mittel verwenden und mit Overhead leben