Fortschrittsbalken beim Kopieren von Dateien mit Java

8

Ich bin sicher, dass diese Frage schon einmal gestellt wurde, aber keine der Antworten, die ich gefunden habe, wird mit meinem bestehenden Code sehr gut funktionieren. Ich poste diese Frage für den Fall, dass es einen Weg gibt, dies zu tun, ohne das, was ich bisher gemacht habe, komplett neu zu machen.

Die Idee besteht darin, beim Kopieren von Dateien und Verzeichnissen von einem Laufwerk auf ein anderes einen sehr einfachen Fortschrittsbalken anzuzeigen. Ich habe eine Klasse namens BasicCopy, die den Inhalt der Ordner "Bilder", "Dokumente", "Videos" und "Musik" (standardmäßig auf Windows-Computern) in Ordner mit demselben Namen in einem Sicherungsverzeichnis auf einem zweiten Laufwerk kopiert. Hier ist die Klasse so weit:

%Vor%

Ich habe eine Methode in einer früheren Klasse, die die Gesamtgröße der Verzeichnisse misst, so dass ich sie gegebenenfalls an diese Klasse weitergeben kann. Ich durchlaufe derzeit jedoch nur die vier Verzeichnisse, also würde ich nicht in der Lage sein, einen Fortschrittsbalken mit einer höheren Auflösung als 25% pro Tick zu erhöhen. Ich frage mich, ob es einen Weg gibt, den ich ändern könnte, so dass ich einen Fortschrittsbalken hinzufügen kann, um es zu überwachen, und habe es ein bisschen genauer? Außerdem bin ich nicht sicher, ob dies in einem anderen Thread gefragt werden sollte oder nicht, aber diese Art des Kopierens von Dateien dauert sehr lange. Es dauert Stunden, 500 MB Dateien zu kopieren, und ich frage mich, ob es eine Möglichkeit gibt, es zu beschleunigen? Dieser Teil hat jedoch keine Priorität. Im Moment bin ich hauptsächlich daran interessiert, einen Fortschrittsbalken hinzuzufügen. Prost!

BEARBEITEN:

Nach einigem Herumspielen wurde mir klar, dass ich wahrscheinlich einen ähnlichen Code verwenden könnte (dieser genaue Code funktioniert vielleicht oder auch nicht - ich habe ihn einfach schnell notiert, damit ich ihn nicht vergessen werde, er ist noch nicht getestet). Dadurch konnte ich den Fortschrittsbalken für jede kopierte Datei aktualisieren.

%Vor%

BEARBEITEN # 2:

Ich habe ein bisschen mehr am Code gearbeitet und glaube, dass ich das meiste herausgefunden habe. Die Frage dreht sich nun um einen SwingWorker, den ich brauche, um die Langzeitmethoden im Hintergrund laufen zu lassen. Andernfalls reagiert die GUI nicht mehr (viele Dokumente dazu in den Java-Dokumenten). Aber hier bleibe ich stecken. Ich habe nur einmal einen SwingWorker benutzt, und das war hauptsächlich mit kopiertem Code. Ich frage mich, wie ich das mit dem folgenden Code implementieren könnte, so dass der Fortschrittsbalken (und der Rest des Rahmens) tatsächlich erscheint.

Aktualisierter Code:

%Vor%     
DerStrom8 24.12.2013, 22:06
quelle

4 Antworten

4

Ich habe eine Lösung gefunden, die funktioniert. Es hat immer noch ein paar kleine Störungen, aber hauptsächlich mit unwichtigen Details. Hier ist, was ich jetzt habe, und es scheint zu funktionieren.

%Vor%

Diese Klasse ist in der Hauptklasse enthalten und wird mit dem folgenden Code gestartet:

%Vor%

Dies wird unmittelbar nach dem Erstellen des Frames aufgerufen und sichtbar gesetzt.

Nun, wie ich schon sagte, ist das immer noch nicht perfekt. Zum Beispiel sollte die Überprüfung, ob es eine Datei oder ein Verzeichnis vor dem Kopieren ist, durch eine rekursive Funktion ersetzt werden, so dass es jede einzelne Datei durchläuft, anstatt nur das Verzeichnis zu kopieren, wenn es ein vollständiges Verzeichnis ist. Dies ermöglicht eine genauere Aktualisierung des Fortschrittsbalkens und zeigt die einzelnen Dateien, die im Textbereich kopiert werden, anstelle von Dateien und Verzeichnissen.

Jedenfalls wollte ich diesen Code nur posten, um zu zeigen, was für mich funktioniert hat, ohne komplett neu zu machen, was ich hatte. Ich werde jedoch weiter daran arbeiten und wichtige Updates veröffentlichen, die zukünftigen Lesern helfen können.

Danke allen für die Antworten, sie haben sehr geholfen!

    
DerStrom8 26.12.2013, 02:09
quelle
3

Ich gehe davon aus, dass Sie eine grafische Fortschrittsleiste und keine konsolenbasierte ( tui ) Lösung möchten. Haben Sie dieses Swing Tutorial gelesen?

BEARBEITEN: Wenn Sie einen Tick Ihres Fortschrittsbalkens pro Datei wünschen, müssen Sie dem Konstruktor des Fortschrittsbalkens nur sagen, wie viele Ticks es insgesamt gibt, etwa:

%Vor%

und organisieren Sie Ihre for-Schleife, um an jeder Datei zu arbeiten, anstatt die Verzeichnisse zu durchlaufen.

    
Amir Afghani 24.12.2013 22:13
quelle
1

Das könnte komplizierter sein und vielleicht eine dumme Idee, vielleicht hilft es ja, also habe ich beschlossen, es zu posten. Verwenden Sie Ihre eigene Methode, um Datei zu kopieren, überprüfen Sie die Dateigröße, nehmen Sie 1 Prozent davon und jedes Mal, wenn Sie die Anzahl der Bisse / mb / erreichen, die 1 Prozent dieser Datei darstellen, aktualisieren Sie Ihre Fortschrittsleiste

Ich habe wenig Zeit, also werde ich zumindest etwas Code mit Kommentaren einfügen, damit Sie eine Vorstellung davon bekommen, was ich denke.

%Vor%

Diese Lösung ist nicht getestet. Dies ist, wie ich anfangen würde, dieses Problem anzugehen.

    
Tomas Bisciak 24.12.2013 23:02
quelle
0

Hier ist meine Idee mit Java 8 und apache FileUtils (kann durch andere ersetzt werden). Es prüft einfach (in einem separaten Thread) die Größe des Verzeichnisses alle n Sekunden:

FUNKTIONS-INTERFACE:

%Vor%

SERVICE:

%Vor%

VERWENDUNG:

%Vor%     
Damiano 23.06.2017 15:32
quelle

Tags und Links