-
Hallo, hab mal ne kleine Frage:
Ich benutze folgenden Code um ein zip-Archiv zu entpacken. Jetzt will ich noch eine Anzeige machen, die zeigt wieviel Prozent schon entpackt sind, wie geht das am besten?
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
package de.tutorials; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class ZipArchiveExtractor { /** * @param args */ public static void main(String[] args) throws Exception { new ZipArchiveExtractor().extractArchive(new File( "c:/tmp/xdoclet-bin-1.2.3.zip"), new File("c:/tmp/x")); } public void extractArchive(File archive, File destDir) throws Exception { if (!destDir.exists()) { destDir.mkdir(); } ZipFile zipFile = new ZipFile(archive); Enumeration entries = zipFile.entries(); byte[] buffer = new byte[16384]; int len; while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); String entryFileName = entry.getName(); if (entry.isDirectory()) { File dir = new File(destDir, entryFileName); // System.out.println(dir); if (!dir.exists()) { dir.mkdir(); } } else { BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(new File(destDir, entryFileName))); BufferedInputStream bis = new BufferedInputStream(zipFile .getInputStream(entry)); while ((len = bis.read(buffer)) > 0) { bos.write(buffer, 0, len); } bos.flush(); bos.close(); bis.close(); } } } }
-
10.10.05 09:29 #2
Das ist doch schon eine gute Grundlage. Für die %-Anzeige brauchst Du allerdings die Gesamtzahl der Dateien. Dumm, daß Du eine Enumeration bekommst. Du hast aber noch die Methode "size()" - und schon hast Du die Lösung.
CU schnuffie
Fragliche Fragen stellende Fragensteller sind für verantwortungslose Antworten antwortender verantwortlicher Antworter selbst verantwortlich.
-
10.10.05 11:20 #3
Was soll das denn? Der Thread läuft ja wohl schon!
hierIch hab keine Ahnung.
Aber davon jede Menge.
-
Yo, den Tread gabs schomal, aber hat sich irgendwie keiner dafür intressiert, deshalb hab ich halt nen neuen gmacht. Ich will schließlich au irgendwann ne Antwort griegn.
Jetzt zur Antwort:
Ich soll also mit Size() die Anzahl der Dateien im Archiv griegn, un dann Bei jedem Durchlauf der while-Schleife die neue Prozent-Zahl berrechnen? Müsste eigentlich funktionieren, mal probieren.
thx
-
10.10.05 14:47 #5
Na denn schau mal.
Also es lässt sich so machen...
Aber Fallbeispiel:
5 Verzeichnisse
Eins hat 31 Unterverzeichnisse und die anderen zwischen 0-5.
Dann tut sich, wenn er das große Verzeichnis bearbeitet erstmal
lange nix und die anderen gehen recht fix.
Das ist dem Hochzählmechanismuss aber dann egal.
Ich hoffe du verstehst
Ich hab keine Ahnung.
Aber davon jede Menge.
-
Ich habs jetzt mit folgendem Code probiert, funktioniert aber nicht richtig. % zählen zu langsam hoch und bei 36 % ist das Archiv fertig entpackt
Mein Code:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.sound.sampled.*; import java.io.*; import java.util.*; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; int fileNumber; //Dateien im Archiv (wird durch size() geliefert) int copiedFiles; //bereits entpackte Dateien int percentage; //Prozent public void extractArchive(File archive, File destDir) throws Exception { jLabel15.setText("Vorbereitung der Datenübertragung"); if (!destDir.exists()) { destDir.mkdir(); } ZipFile zipFile = new ZipFile(archive); Enumeration entries = zipFile.entries(); byte[] buffer = new byte[16384]; int len; fileNumber = zipFile.size(); while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); String entryFileName = entry.getName(); if (entry.isDirectory()) { File dir = new File(destDir, entryFileName); jLabel15.setText("Kopiere Dateien..." + dir.getName()); copiedFiles++; percentage = 100 * copiedFiles / fileNumber; this.setTitle("Sea Wars - " + percentage + "%"); if (!dir.exists()) { dir.mkdir(); } } else { BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(new File(destDir, entryFileName))); BufferedInputStream bis = new BufferedInputStream(zipFile .getInputStream(entry)); while ((len = bis.read(buffer)) > 0) { bos.write(buffer, 0, len); } bos.flush(); bos.close(); bis.close(); } } }
Was stimmt da nicht?
-
10.10.05 15:29 #7
Probiers mal so:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import javax.sound.sampled.*; import java.io.*; import java.util.*; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; int ProGesamt; // Bisher geschaffte Prozentzahl int ProStep; // In dem Intervall wird hochgezählt public void extractArchive(File archive, File destDir) throws Exception { jLabel15.setText("Vorbereitung der Datenübertragung"); if (!destDir.exists()) { destDir.mkdir(); } ZipFile zipFile = new ZipFile(archive); Enumeration entries = zipFile.entries(); byte[] buffer = new byte[16384]; int len; ProStep = 100 / zipFile.size(); //Hier wird das Intervall ausgerechnet while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); String entryFileName = entry.getName(); if (entry.isDirectory()) { File dir = new File(destDir, entryFileName); jLabel15.setText("Kopiere Dateien..." + dir.getName()); ProGes=ProGes+ProStep; this.setTitle("Sea Wars - " + ProGes + "%"); if (!dir.exists()) { dir.mkdir(); } } else { BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(new File(destDir, entryFileName))); BufferedInputStream bis = new BufferedInputStream(zipFile .getInputStream(entry)); while ((len = bis.read(buffer)) > 0) { bos.write(buffer, 0, len); } bos.flush(); bos.close(); bis.close(); } //Hier nochmal deine Anzeige auf 100% setzen } }
Warnung: habs nur schnell im Edit geschrieben
So müsste es gehen.Ich hab keine Ahnung.
Aber davon jede Menge.
-
Des funktioniert net.
1. ergibt 100/zipFile.size() einen Wert unter 0.5, weil Integer aber nur ganze Zahlen kennt, wird auf null abgerundet. Also hab ich statt int double benutzt
2. Ich bekomm für zipFile.size() mit Integer 555555555 als Wert, mit Double 555.0, des kann aber net sein. Warum Was soll des
-
11.10.05 08:29 #9
Sorry, mein Fehler.
Das muss natürlich so sein:
Code :1 2 3 4 5 6 7
import java.lang.Integer; ... double ProGesamt; double ProStep; ... //Die Berechnung des Intervalls ProStep=100 / [b][color=black][url="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html#doubleValue%28%29"]doubleValue[/url][/color][/b](ZipFile.size());
PS: Wenn du mir das Ergebnis gibst, wäre es auch gut zu wissen wie viele
Files es waren.
Ich hoffe es geht jetzt
Ich hab keine Ahnung.
Aber davon jede Menge.
-
11.10.05 08:30 #10
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.327
- Blog-Einträge
- 29
Hallo!
An deiner Stelle wuerde ich mir irgendwoher die Zip Dateiformat Spezifikation besorgen und nachschauen, ob es irgendwo ein Header-Feld gibt, indem die urspruengliche Gesamtgroesse aller Dateien drinnen steht. Wenn du diese Information hast brauchst du eigentlich nur die bytes zu zaehlen, welche du auf die Platte oder wohin auch immer rausschreibst...
Gruss TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
11.10.05 08:44 #11
Das is ne gute Idee.
Wenn das geht, ist es die bessere (genauere) LösungIch hab keine Ahnung.
Aber davon jede Menge.
-
11.10.05 10:44 #12
Die unkomprimierte Größe bekommst Du mit myZipEntry.getSize() heraus. Addiere also vor dem Entpacken alle diese Größen (= 100%) und errechne somit je entpackter Datei die Fortschrittsanzeige.
CU schnuffie
Fragliche Fragen stellende Fragensteller sind für verantwortungslose Antworten antwortender verantwortlicher Antworter selbst verantwortlich.
-
11.10.05 12:47 #13
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.327
- Blog-Einträge
- 29
Hallo!
Das waere IMHO keine wirklich gute Idee.... da waeren ja dann 2 Durchgaenge notwendig. 1) Groessenermittlung
2) Eigentlicher (erneuter) Entpackvorgang mit Darstellung des Fortschritts...
... bei nur einem Durchgang nuetzt dir diese Art der groessen Bestimmung nicht viel, da du die letzendliche Information um einen Absoluten %-Wert angeben zu koennen erst nach der letzten Datei hast...
Gruss TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
11.10.05 13:02 #14
...es macht schon einen Unterschied, ob ich auspacke oder nur mal schnell die Größe abfrage - es scheint schon sowas wie eine Header-Information zu sein.
Toms Idee, die Header-Infos abzufragen = das Gleiche.CU schnuffie
Fragliche Fragen stellende Fragensteller sind für verantwortungslose Antworten antwortender verantwortlicher Antworter selbst verantwortlich.
Ähnliche Themen
-
Externe swf-Dateien mit Prozentanzeige
Von jackassol im Forum Flash PlattformAntworten: 9Letzter Beitrag: 03.01.06, 00:05 -
Fehlermaldung beim Versuch, ein Archiv zu entpacken
Von C4D_Joe im Forum Microsoft WindowsAntworten: 7Letzter Beitrag: 04.07.05, 08:52 -
Upload mit entpacken
Von borgelite im Forum PHPAntworten: 23Letzter Beitrag: 22.05.05, 10:52 -
Kann WinRAR archiv nicht entpacken.
Von sleepo im Forum Microsoft WindowsAntworten: 7Letzter Beitrag: 23.05.04, 19:32 -
packen / entpacken mit php
Von Razorhawk im Forum PHPAntworten: 6Letzter Beitrag: 08.09.02, 14:45



Zitieren

Login





Lesezeichen