Java Dateien kopieren mit Fortschrittsbalken

MJannek

Bekanntes Mitglied
Ich möchte ein Java Programm schreiben,ndas mir Dateien kopiert und dabei anzeigt, wieviel Prozent schon von jedem einzelnen File kopiert sind. Ich habe es bereits probiert mit:
Java:
File oldFile = new File("Source");
File newFile = new File("Dest");
oldFile.renameTo(newFile);
Jedoch gibt mir dieser Befehl nur den Fortschritt nach jedem Kopiervorgang zurück. Also bei 4 File bsw. 25, 50,75 und 100 Prozent. Ich möchte aber gerne so eine ProgressBar wie z.B. beim Total Commander? Ist das möglich?
Vielen Dank
 
Klar ist das möglich, sonst könnten die ganzen anderen Tools wie Windows Explorer oder Total Commander das ja auch nicht.
Aber erstmal zwei Dinge:
1. File.renameTo(File) kopiert nichts
2. Um den Fortschritt eines wirklichen Kopierens zu messen, darfst du keine "do-it-all-at-once" built-in Methoden vom JRE verwenden, sondern musst das selbst machen, indem du immer Chunk/Buffer-weise Bytes von A nach B kopierst. Danach weißt du ja immer, wieviele Chunks du schon kopiert hast und kannst daraus einen Fortschritt berechnen.
 
Vor 100 Jahren habe ich mal das hier implementiert

Java:
    /**
     * Copy a file.
     * @param source full source file name including path
     * @param destination full destination file name including path
     * @throws FileNotFoundException
     * @throws IOException
     */
    private static void copyFile(final String source, final String destination) throws FileNotFoundException, IOException {
        FileInputStream fSrc = new FileInputStream(source);
        FileOutputStream fDest = new FileOutputStream(destination);
        byte buffer[] = new byte[4096];
        int len;

        while ( (len=fSrc.read(buffer)) != -1)
            fDest.write(buffer,0,len);
        fSrc.close();
        fDest.close();
    }

Da könnte man in die Schleife das Update des ProgressBars reinwuseln und gut ist.
 
Müßte eigentlich einfach sein, das über die Methode length der Klasse File hinzubekommen.
Also sowas wie
Java:
long srcLen = new File(source).length();
Oder so...
 
Vielen Dank ich hab es hinbekommen. Ich habe jetzt nur noch das Problem, das der Gesamtfortschritt bei jedem File bei 0 beginnt und bei z.B.2 Files immer bis 50 % geht. Was mache ich falsch?
 
Vielen Dank ich hab es hinbekommen. Ich habe jetzt nur noch das Problem, das der Gesamtfortschritt bei jedem File bei 0 beginnt und bei z.B.2 Files immer bis 50 % geht. Was mache ich falsch?
Ich würde sagen, du machst falsch, dass der Gesamtfortschritt für beide Dateien zusammen nicht einmal bei 0% anfängt und insgesamt bis 100% geht. Also, der Gesamtfortschritt darf nicht für jede Datei einzeln von vorne beginnen und für zwei Dateien nur bis 50% gehen, sondern muss insgesamt linear von 0% bis 100% gehen, über alle Dateien gemessen.
 
Ich würde sagen, du machst falsch, dass der Gesamtfortschritt für beide Dateien zusammen nicht einmal bei 0% anfängt und insgesamt bis 100% geht. Also, der Gesamtfortschritt darf nicht für jede Datei einzeln von vorne beginnen und für zwei Dateien nur bis 50% gehen, sondern muss insgesamt linear von 0% bis 100% gehen, über alle Dateien gemessen.
Nur als Ergänzung: Geht natürlich auch beides.
Ein Zähler und eine Größe pro Datei und ein Zähler für alle Dateien und die Summe der Größen aller Dateien.
 

Zurück
Oben