Zip Datei in Zip Datei einpacken

Status
Nicht offen für weitere Antworten.

RBS2002

Aktives Mitglied
Hi, der Titel beschreibt glaube ich bereits mein Problem, hier aber erst einmal der bisherige Code:

Code:
           it5 = null;
            it5 = tempo.iterator();

            while (it5.hasNext()) {
                int read = 0;
                byte[] data = new byte[1024];
                String temp2 = it5.next().toString();
                ZipEntry entry = new ZipEntry(temp2);
                FileInputStream in = new FileInputStream(scannerdir + "/" + temp2);
                File temp4 = new File(scannerdir + "/" + temp2);
                String temp3 = new String();
                temp3 = temp3.concat(temp2.substring(temp2.length() - 4, temp2.length()));
                if (temp3.equals(".zip") == false) {
                    out.putNextEntry(entry);
                    while ((read = in.read(data, 0, 1024)) != -1) {
                        out.write(data, 0, read);
                    }
                    out.closeEntry();
                }
                in.close();
                temp4.delete();
            }
            ((DefaultListModel) anhangmail.getModel()).addElement(pfad + ".zip");
            out.close();

            int zaehler = 0;
            int z = 0;
            int puffi = anhang1z - temp.length;
            while (anhang1z != puffi) {
                ((DefaultListModel) anhangmail.getModel()).remove(temp[z] - zaehler);
                z++;
                zaehler++;
                anhang1z--;
            }
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

Bei dem Programm kann der User in einer Liste auswählen welche Dateianhänge er in eine Zip speichern will. Die gewählten werden nach dem einpacken gelöscht und ein Eintrag mit dem Namen der ersten gewählten Datei wird für die Zip-Datei verwendet. Die Zip Datei wird vorher erstellt, soweit also keine Probleme. An sich läuft der Code bei nicht-Zip Dateien (vielleicht auch andere Archivdateien, aber die interessieren nicht da die dort sowieso nicht benutzt werden :wink: ) sehr gut, nur bei zip-Dateien scheint er die eventuell in einer Endlosschleife immer wieder auszupacken und den Inhalt immer wieder, bis ins unendliche einzupacken. Wenn ich lange genug warte habe ich statt einem 100kb Archiv ein 500MB Archiv :shock: . Wie gesagt, ich weiss nicht wirklich was ich bei dem Problem machen soll (will ja keine Festplatten füllen, dafür kann man es natürlich benutzen) und würde mich über Hilfe freuen,

mfG RBS2002

PS: Falls der Quelltext mit !=zip als Möglichkeit empfunden wird, der ist eigentlich nur drin damit er zip-Dateien nicht beachtet und gar nicht erst auf die Idee kommt diese einzupacken, aber so soll es ja eben nicht sein....
 
hmmm, lauffähig, naja - im Prinzip ist das Programm lauffähig, deshalb mal der komplette Code:

Code:
    public static void ziperstellen(String name) {
        try {

            ZipOutputStream out = null;
            File temp = new File(scannerdir + "/" + name + ".zip");

            if (temp == null) {
                try {
                    temp.createNewFile();
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else {
                try {
                    temp.delete();
                    temp.createNewFile();
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

            out = new ZipOutputStream(new FileOutputStream(scannerdir + "/" + name + ".zip"));
            out.setMethod(ZipOutputStream.DEFLATED);
            out.setLevel(9);
            itemp = ablagemaillist.iterator();
            while (itemp.hasNext()) {
                int read = 0;
                byte[] data = new byte[1024];
                String temp2 = itemp.next().toString();
                ZipEntry entry = new ZipEntry(temp2);
                FileInputStream in = new FileInputStream(scannerdir + "/" + temp2);
                File temp4 = new File(scannerdir + "/" + temp2);
                String temp3 = new String();
                temp3 = temp3.concat(temp2.substring(temp2.length() - 4, temp2.length()));
                if (temp3.equals(".zip") == false) {
                    out.putNextEntry(entry);
                    while ((read = in.read(data, 0, 1024)) != -1) {
                        out.write(data, 0, read);
                    }
                    out.closeEntry();
                }
                in.close();
                temp4.delete();
            }
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

im Prinzip ist es ganz leicht anzupassen. Die Ablagemaillist hat den Dateinamen der Dateien in einem bestimmten Ordner(vorher eingescannt). Diese werden nach dem durchscannen einfach nach und nach in dem Pfad "durchgenommen" und an die Zip-Datei angehangen und kopiert (vielleicht da der Fehler, nur wie soll ich das sonst bei einer zip-Datei machen).

PS: Die hier ebgebildete Funktion ist ein wenig anders, im Prinzip aber das selbe mit dem gleichen Fehler
 
RBS2002 hat gesagt.:
ein Eintrag mit dem Namen der ersten gewählten Datei wird für die Zip-Datei verwendet.
Kann es dann bei einer ZIP-Datei nicht passieren, dass das zu erstellende Zip-File genauso heisst wie die erste Datei, die da hineingeschrieben werden soll? Das dürfte aber wohl kaum dazu führen, dass es zu einer Endlosschleife kommt.
 
ja, das kann vorkommen, besonders wenn ich den Dateinamen vorgebe, also nicht dynamisch wie im ersten Beispiel). Aber dies ist nicht das Problem, die zip Datei wird ja auch vorher noch einmal gelöscht falls sie bereits da ist und danach neu erstellt. Aber wie gesagt, bin selber etwas verwirrt, trotzdem danke (werde das später (morgen) auch so umschreiben das falls die erste selektierte Datei eine zip Datei ist eine 1 hinten ran gehangen wird, vielleicht ist das wirklich des Rätsels Lösung, auch wenn ich es selber nicht glaube)
 
Leute, ich weiss nicht was ich jetzt sagen soll - aber ich habe heute das Schreckensszenario durchgespielt und es hat seltsamerweise dieses mal wunderbar geklappt. Ich weiß jetzt ehrlich gesagt nicht was ich damit anfangen soll, der PC ist gleich, netbeans ist gleich etc. Nicht das der das später noch einmal macht und ich dafür die Rüge kriege. Aber nun gut, das ist jetzt erst einmal egal. Naja, trotzdem vielen Dank an alle - das Problem ist erledigt
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben