tutorials.de-Buchverschenkaktion 08/2010
+ Auf Thema antworten
  1. #1
    MiRaMC MiRaMC ist offline Mitglied Gold MiRaMC hat eine blütenweiße Weste
    Registriert seit
    Sep 2003
    Beiträge
    106
    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();
                }
            }
        }
      }

  2. #2
    Benutzerbild von schnuffie
    schnuffie schnuffie ist offline Mitglied Platin schnuffie befindet sich auf einem aufstrebenden Ast
    Registriert seit
    Oct 2004
    Ort
    Ober-Roden (Hessen)
    Beiträge
    702
    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.

  3. #3
    Benutzerbild von RealHAZZARD
    RealHAZZARD RealHAZZARD ist offline Mitglied Brokat RealHAZZARD hat eine blütenweiße Weste
    Registriert seit
    Mar 2005
    Beiträge
    388
    Was soll das denn? Der Thread läuft ja wohl schon!
    hier
    Ich hab keine Ahnung.
    Aber davon jede Menge.

  4. #4
    MiRaMC MiRaMC ist offline Mitglied Gold MiRaMC hat eine blütenweiße Weste
    Registriert seit
    Sep 2003
    Beiträge
    106
    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

  5. #5
    Benutzerbild von RealHAZZARD
    RealHAZZARD RealHAZZARD ist offline Mitglied Brokat RealHAZZARD hat eine blütenweiße Weste
    Registriert seit
    Mar 2005
    Beiträge
    388
    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.

  6. #6
    MiRaMC MiRaMC ist offline Mitglied Gold MiRaMC hat eine blütenweiße Weste
    Registriert seit
    Sep 2003
    Beiträge
    106
    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?

  7. #7
    Benutzerbild von RealHAZZARD
    RealHAZZARD RealHAZZARD ist offline Mitglied Brokat RealHAZZARD hat eine blütenweiße Weste
    Registriert seit
    Mar 2005
    Beiträge
    388
    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.

  8. #8
    MiRaMC MiRaMC ist offline Mitglied Gold MiRaMC hat eine blütenweiße Weste
    Registriert seit
    Sep 2003
    Beiträge
    106
    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

  9. #9
    Benutzerbild von RealHAZZARD
    RealHAZZARD RealHAZZARD ist offline Mitglied Brokat RealHAZZARD hat eine blütenweiße Weste
    Registriert seit
    Mar 2005
    Beiträge
    388
    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.

  10. #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 Tom
    Java 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. #11
    Benutzerbild von RealHAZZARD
    RealHAZZARD RealHAZZARD ist offline Mitglied Brokat RealHAZZARD hat eine blütenweiße Weste
    Registriert seit
    Mar 2005
    Beiträge
    388
    Das is ne gute Idee.
    Wenn das geht, ist es die bessere (genauere) Lösung
    Ich hab keine Ahnung.
    Aber davon jede Menge.

  12. #12
    Benutzerbild von schnuffie
    schnuffie schnuffie ist offline Mitglied Platin schnuffie befindet sich auf einem aufstrebenden Ast
    Registriert seit
    Oct 2004
    Ort
    Ober-Roden (Hessen)
    Beiträge
    702
    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.

  13. #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 Tom
    Java 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

  14. #14
    Benutzerbild von schnuffie
    schnuffie schnuffie ist offline Mitglied Platin schnuffie befindet sich auf einem aufstrebenden Ast
    Registriert seit
    Oct 2004
    Ort
    Ober-Roden (Hessen)
    Beiträge
    702
    ...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

  1. Externe swf-Dateien mit Prozentanzeige
    Von jackassol im Forum Flash Plattform
    Antworten: 9
    Letzter Beitrag: 03.01.06, 00:05
  2. Fehlermaldung beim Versuch, ein Archiv zu entpacken
    Von C4D_Joe im Forum Microsoft Windows
    Antworten: 7
    Letzter Beitrag: 04.07.05, 08:52
  3. Upload mit entpacken
    Von borgelite im Forum PHP
    Antworten: 23
    Letzter Beitrag: 22.05.05, 10:52
  4. Kann WinRAR archiv nicht entpacken.
    Von sleepo im Forum Microsoft Windows
    Antworten: 7
    Letzter Beitrag: 23.05.04, 19:32
  5. packen / entpacken mit php
    Von Razorhawk im Forum PHP
    Antworten: 6
    Letzter Beitrag: 08.09.02, 14:45

Lesezeichen

Lesezeichen