Kann ich den Fortschritt des Dateikopierens mit FileInfo.CopyTo () in .NET anzeigen?
Ich habe ein Kopierdienstprogramm in c # (.NET 2.0 Framework) erstellt, mit dem Dateien, Verzeichnisse und rekursive Unterverzeichnisse usw. kopiert werden. Das Programm verfügt über eine grafische Benutzeroberfläche, in der die aktuell kopierte Datei, die aktuelle Dateinummer (Sequenz) und die Gesamtzahl angezeigt werden Anzahl der zu kopierenden Dateien und der Prozentsatz der abgeschlossenen Kopiervorgänge. Es gibt auch einen Fortschrittsbalken, der auf der aktuellen Datei / den Gesamtdateien basiert.
Mein Problem hängt mit dem Kopieren großer Dateien zusammen. Ich konnte keine Möglichkeit finden, den gesamten Kopierfortschritt einer großen Datei anzuzeigen (unter Verwendung meiner aktuellen Klassenstruktur, die die FileInfo.CopyTo-Methode verwendet). Um dieses Problem zu umgehen, habe ich die Dateikopiervorgänge und die GUI-Anzeige in ihre eigenen Threads aufgeteilt und einen visuellen Hinweis eingerichtet, um anzuzeigen, dass die Arbeit erledigt ist. Zumindest ist dem Benutzer bewusst, dass das Programm nicht eingefroren ist und weiterhin Dateien kopiert.
Besser wäre es, den Fortschritt anhand der Gesamtzahl der Bytes anzeigen zu können oder einen Ereignistyp zu haben, der von der FileInfo.CopyTo-Methode ausgelöst wird und der die Gesamtzahl der aus der aktuellen Datei kopierten Bytes angibt.
Ich kenne die FileInfo.Length-Eigenschaft, daher kann ich sicher sein, dass mein eigenes MacGuyver-Ereignis auf dieser basiert und einen Handler auf der GUI-Seite für das Lesen der Updates hat (möglicherweise basierend auf dem Überprüfen der FileInfo. Längeneigenschaft des Zielobjekts mit einem Timer?).
Kennt jemand einen Weg, dies zu tun, den ich übersehen habe? Wenn ich es vermeiden kann, würde ich meine Klasse lieber nicht umschreiben, um Bytes durch einen Stream zu kopieren und sie auf diese Weise zu verfolgen (obwohl ich denke, dass ich mit diesem Weg nicht weiterkomme).
Danke im Voraus
PS: Ich bin vorerst mit dem .NET 2.0-Framework konfrontiert. Daher ist eine Lösung, für die nur Funktionen mit> = 3.0 erforderlich sind, für mich keine Option.
PPS - Ich bin offen für Lösungen in allen .NET-Sprachen, nicht nur für C #.