Archiv entpacken mit Prozentanzeige

MiRaMC

Erfahrenes Mitglied
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:
 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();
  			}
  		}
  	}
  }
 
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.
 
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
 
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 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:
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?
 
Probiers mal so:

Code:
 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.
 
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
 
Sorry, mein Fehler.
Das muss natürlich so sein:

Code:
 import java.lang.Integer;
 ...
 double ProGesamt; 
  double ProStep;
 ...
 //Die Berechnung des Intervalls
 ProStep=100 / doubleValue(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;-]
 
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 Tom
 
Zurück