brusli: Zippen mehrere Dateien und Directory nach einem Ausgang

Hallo Gemeinde,
ich habe folgende Probleme,
1. Ich möchte multiple zip files und directory mit dem package java.util.zip.*; zippen z.B : c:\Programme+c:\test.txt+c:\andereVerzeichnis = ausgang.zip oder Dir+Dir+Dateien+Dateien = ausgang.zip. Bis jetzt kann ich nur zippen entweder nur Verzeichnisse oder Dateien, Sie können mein Code ansehen unten.
2. Wie kann ich die grösse gezippte Dateien oder Verzeichnissen beschränken auf 700 MB (Split nach Volume and Merge wie winzip)
3. Wie kann ich inkrementielle Verfahren benutzen, dh die alte Dateien oder Verzeichnisse soll aktualisiert werden zum Zweck der Sicherung

Hier ist mein Code in Bezug auf 1. Frage

Zip nur Dateien

import java.util.zip.*;
 import java.io.*;
 public class zip_files
 {
     public static void main(String[] args) throws IOException
     {
 File[] all = {new File("C:\cdrecord.exe"), new File("C:\mkisofs.exe")};
 createZip(new File("c:\output.zip"),all);
     }

public static void createZip(File zipFileName,File[] selected)
     {
       try
   {
     byte[] buffer = new byte[1024];
     ZipOutputStream out = new ZipOutputStream(new
     FileOutputStream(zipFileName));
     out.setLevel(Deflater.DEFAULT_COMPRESSION);
     for (int i = 0; i < selected.length; i++)
     {
       FileInputStream in = new FileInputStream(selected[i]);
       out.putNextEntry(new ZipEntry(selected[i].getPath()));
       int len;
       while ((len = in.read(buffer)) > 0)
       {
         out.write(buffer, 0, len);
       }
       out.closeEntry();
       in.close();
     }
    out.close();
   }
   catch (IllegalArgumentException iae)
   {
      iae.printStackTrace();
   }
   catch (FileNotFoundException fnfe)
   {
      fnfe.printStackTrace();
   }
   catch (IOException ioe)
   {
   ioe.printStackTrace();
   }
}
}

Zip nur Verzeichnis

import java.util.zip.*;
 import java.io.*;
 public class zip_dir_all
 {
     public static void main(String[] args) throws IOException
     {
        String dirpath = "c:\jtutor";
 String ZipName = "c:\output.zip";
 ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(ZipName));
 zipdirectory(dirpath,zos);
 zos.close();
     }

public static void zipdirectory(String dirpath, ZipOutputStream zos) throws IOException
     {
 File f = new File(dirpath);
 String[] flist = f.list();
 for(int i=0; i<flist.length; i++)
 {
     File ff = new File(f,flist[i]);
     if(ff.isDirectory())
     {
       zipdirectory(ff.getPath(),zos);
       continue;
     }
     String filepath = ff.getPath();
     ZipEntry entries = new ZipEntry(filepath);
     zos.putNextEntry(entries);
     FileInputStream fis = new FileInputStream(ff);
     int buffersize = 1024;
     byte[] buffer = new byte[buffersize];
     int count;
     while((count = fis.read(buffer)) != -1)
     {
  zos.write(buffer,0,count);
     }
            fis.close();
 }
     }
 }

Zip nur sub Verzeichnis

import java.util.zip.*;
import java.io.*;
 public class zip_dir
 {
     public static void main(String[] args) throws IOException
     {
        File[] alle = {new File("c:\ftpjakarta")};
        String dirpath = "c:\jtutor";
 String ZipName = "c:\output.zip";
 zipdirectory(dirpath,ZipName);

}

public static void zipdirectory(String dirpath, String ZipName) throws IOException
     {
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(ZipName));
 File f = new File(dirpath);
 String[] flist = f.list();
 int buffersize = 1024;
 byte[] buffer = new byte[buffersize];
 int count;
 for(int i=0; i<flist.length; i++)
 {
     File ff = new File(f,flist[i]);
     if(ff.isDirectory())
       continue;
     String filepath = ff.getPath();
     ZipEntry entries = new ZipEntry(filepath);
     zos.putNextEntry(entries);
     FileInputStream fis = new FileInputStream(ff);
     while((count = fis.read(buffer)) != -1)
     {
  zos.write(buffer,0,count);
     }
            fis.close();
 }
 zos.close();
     }
 }

Ich bedanke mich für eure Hilfe, Sie können auch die Lösung per E-mail schicken an : brusli@excite.com

  1. Servus,

    Hier mal eine etwas umfassendere Doku zu java.util.zip
    http://javaalmanac.com/egs/java.util.zip/pkg.html
    http://java.sun.com/j2se/1.4.2/docs/api/ Auch hier kein anhaltspunkt auf Deine geforderte Funktion.

    ich habe folgende Probleme,

    1. Ich möchte multiple zip files und directory mit dem package java.util.zip.*; zippen z.B : c:\Programme+c:\test.txt+c:\andereVerzeichnis = ausgang.zip oder Dir+Dir+Dateien+Dateien = ausgang.zip. Bis jetzt kann ich nur zippen entweder nur Verzeichnisse oder Dateien, Sie können mein Code ansehen unten.

    Soweit ich die Doku hierfür verstanden habe, musst Du Dich wohl entscheiden, entweder Vezeichnisse oder Datei Listen.
    Beide Datentypen kann das Tool leider nicht.
    Dafür würde java.util.zip auch nicht gedacht. Schliesslich benötigt man das nur mit jar.
    Hierbei liegt der fokus auf das entpacken und / oder packen von Jar EAR WAR AAR archiven.
    Letztendlich sind es alles zip archive.

    1. Wie kann ich die grösse gezippte Dateien oder Verzeichnissen beschränken auf 700 MB (Split nach Volume and Merge wie winzip)

    Sie oben dafür war es nicht gedacht.

    1. Wie kann ich inkrementielle Verfahren benutzen, dh die alte Dateien oder Verzeichnisse soll aktualisiert werden zum Zweck der Sicherung

    Das kann es nicht.

    Wenn Du das realisieren möchtest, solltest Du eventuell Winzip Commandline Tool
    besorgen und per System calls Deine archive packen.

    Gruss Matze

    1. Hallo,

      1. Ich möchte multiple zip files und directory mit dem package java.util.zip.*; zippen z.B : c:\Programme+c:\test.txt+c:\andereVerzeichnis = ausgang.zip oder Dir+Dir+Dateien+Dateien = ausgang.zip. Bis jetzt kann ich nur zippen entweder nur Verzeichnisse oder Dateien, Sie können mein Code ansehen unten.

      Soweit ich die Doku hierfür verstanden habe, musst Du Dich wohl entscheiden, entweder Vezeichnisse oder Datei Listen.

      Entweder ich bin heute noch nicht so fit, oder ihr schreibt irgendwie
      beide ziemlich wirr. (OK, bei Brusli dürfte das an mangelnden
      Deutschkenntnissen liegen.)

      Was wolltest du mit dem obenstehenden Satz sagen?

      Beide Datentypen kann das Tool leider nicht.

      Welche Datentypen? Dateien und Verzeichnisse? Also, man kann mit den
      Klassen von java.util.zip sowohl (leere) Verzeichnisse als auch
      Dateien anlegen. Und man kann Dateien in Verzeichnisse schreiben.
      Daß man nicht einfach sagen kann "Hey, ZipFile, jetzt übernimm mal
      das ganze Verzeichnis c:\meinVerzeichnis\ in das Zip, ohne daß ich
      irgendwas tun muß" sollte klar sein.

      Eine Methode MyZipUtils.addDirectoryToZip(String dir, ZipOutputStream out)
      zu schreiben, sollte jetzt aber nicht so schwer sein, denke ich.

      Dafür würde java.util.zip auch nicht gedacht. Schliesslich benötigt man das nur mit jar.

      Was benötigt man nur für Jar? Wie gesagt, ich verstehe dich nicht.
      Sorry. :)

      Hierbei liegt der fokus auf das entpacken und / oder packen von Jar EAR WAR AAR archiven.

      Hierbei? Wobei?

      Letztendlich sind es alles zip archive.

      Ja.

      Disclaimer: Ich habe den Ausgangsposter nicht wirklich verstanden.
      Vielleicht habe ich auch deshalb Probleme deiner Antwort zu folgen.
      Bitte daher nicht übel nehmen.

      1. Wie kann ich die grösse gezippte Dateien oder Verzeichnissen beschränken auf 700 MB (Split nach Volume and Merge wie winzip)

      Sie oben dafür war es nicht gedacht.

      Naja, man könnte natürlich einfach die ganze Datei packen und dann
      in 700MB-Blöcke aufsplitten. Winzip (bzw. ARJ damals) machen das
      sicherlich auch nicht erheblich anders.

      1. Wie kann ich inkrementielle Verfahren benutzen, dh die alte Dateien oder Verzeichnisse soll aktualisiert werden zum Zweck der Sicherung

      Das kann es nicht.

      Muß man es selbst programmieren, ja.

      Vielleicht noch einen allgemeinen Hinweis: Man kann verallgemeinernd
      sagen, daß bei Änderungen an ZIP-Dateien immer die gesamte ZIP-
      Datei neu geschrieben werden muß. Ein inkrementelles Verfahren ist
      daher nur durch geschickte Programmierung möglich.

      Gruß
      Slyh

      1. Sevrvs,

        Soweit ich die Doku hierfür verstanden habe, musst Du Dich wohl entscheiden, entweder Vezeichnisse oder Datei Listen.

        Entweder ich bin heute noch nicht so fit, oder ihr schreibt irgendwie
        beide ziemlich wirr. (OK, bei Brusli dürfte das an mangelnden
        Deutschkenntnissen liegen.)

        Was wolltest du mit dem obenstehenden Satz sagen?

        Dass Du nicht bei einem Vorgang sowohl reele Dateien und ganze Verzeichnisse
        in ein Zipfile per java.util.zip packen kannst.

        Welche Datentypen? Dateien und Verzeichnisse? Also, man kann mit den
        Klassen von java.util.zip sowohl (leere) Verzeichnisse als auch
        Dateien anlegen. Und man kann Dateien in Verzeichnisse schreiben.
        Daß man nicht einfach sagen kann "Hey, ZipFile, jetzt übernimm mal
        das ganze Verzeichnis c:\meinVerzeichnis\ in das Zip, ohne daß ich
        irgendwas tun muß" sollte klar sein.

        Natürlich hast Du recht. Aber ist meine Anspruch zu hoch, das man eine Aussage im Zusammenahng der gestellten Frage sieht?

        Trink einen Kaffe schlaf Deinen Rausch von gestern aus....
        Und verknüpfe einfach die Frage des Fragestellers mit meiner Antwort.

        Gruss Matze

        1. Hallo nette Gemeide,
          danke für eure Beitrag, wieso meine Fragen macht euch durcheinander, so ich bitte um Entschuldigung, jemand hat Recht dass meine Deutsche Sprache wahrscheinlich nicht so gut. Ich wollte eigentlich ein Programm wie winzip machen, zum Einpacken Verzeichnis oder Dateien ist kein Problem aber wenn man beide (und zwar Verzeichnis und Dateien zB ganze Verzeichnis und Dateien  c:\Programme + d:\text.txt) gleichzeitig einpacken, das habe ich keine Idee, aber ich bin 100 Pro sicher dass das geht. Es wäre schon wenn jemand ein Beispiel oder Code geben kann. Ich bedanke mich im voraus.

          1. Servus,

            warum so kopiziert?
            Wenn Du einzelne Dateien einchecken willst, und ggf. den Inhalt aus 1 - mehreren Verzeichnissen.

            Dann mach doch folgendes, kopiere Deine Dateien in ein temporäres Verzeichnis und zippe ab dort unter angabe des Verzeichnisses.

            Wenn dir das nicht gefällt, dann musst Du wohl rekursiv (hierfür sollte es eine in Java entsprechende Methode geben)
            das Vrzeichnis durchsuchen und beim packen dann die ermittelten Dateien einzeln angeben.

            File operationen per Java sind jedoch an der Stelle nicht mehr meine Welt.

            Gruss Matze

          2. Hallo,

            danke für eure Beitrag, wieso meine Fragen macht euch durcheinander, so ich bitte um Entschuldigung, jemand hat Recht dass meine Deutsche Sprache wahrscheinlich nicht so gut.

            Macht ja nix. Viel wichtiger wäre es, daß deine Problembeschreibung
            so detailliert ist, daß wir damit etwas anfangen können. Leider ist
            (zumindest) mir noch immer nicht klar, was denn nun überhaupt dein
            genaues Problem ist.

            Der Code, den du in deinem Ausgangsposting genannt hast, sieht ja schon
            ziemlich ordentlich aus. Du kannst Dateien und Verzeichnisse
            (inklusive der enthaltenen Dateien) einpacken. Beide Methoden, die
            das leisten, befinden sich offensichtlich noch in verschiedenen
            Applikationen. Beide Methoden in eine Applikation zu übernehmen,
            und vielleicht noch ein wenig anzupassen, sollten ja eigentlich
            unproblematisch sein.

            Mach doch mal einfach folgendes:
            Schreibe ein Programm, das rekursiv alle Verzeichnisse durchlaufen
            kann, und jeweils das aktuelle Verzeichnis relativ zum Start-
            Verzeichnis, sowie die gerade verarbeitete Datei ausgeben kann. Wenn
            das funktioniert, hast du den wichtigsten Schritt bereits getan.

            Von dort ausgehend, sollte es meiner Meinung nach kein Problem mehr
            sein, eine Methode "addFileToZip(File file, String relativePath)" zu
            schreiben, die die jeweils aktuelle Datei in das ZIP schreibt. (Den
            relevanten Code hast du ja bereits gepostet.)

            Auch einzelne Dateien könntest du mit derselben Methode in das ZIP
            übernehmen. Ein Verzeichnis ist ja auch nichts anderes als eine
            Sammlung von Dateien. Die mußt nur zuerst die Dateien, die im
            enthalten sind, herausfinden...

            Vielleicht noch ein wenig Code für den Einstieg:

            public static void main(String[] args) throws IOException
               {
                  // Prepare ZIP output here. Open ZipOutputStream and so on.
                  // ...
                  // ZipOutputStream out = ...
                  // ...

            // Adding directories and files.
                  for (int i = 0; i < args.length; i++) {
                     File dirOrFile = new File(args[i]);
                     if (dirOrFile.isDirectory()) {
                        addDirToZip(dirOrFile, out);
                     } else (if dirOrFile.isFile()) {
                        addFileToZip(dirOrFile, out);
                     }
                  }
               }

            Das ist natürlich nur als Beispiel zu verstehen. Du solltest es
            deinen Bedürfnissen anpassen.

            Es wäre schon wenn jemand ein Beispiel oder Code geben kann. Ich bedanke mich im voraus.

            Den Code, den du selbst geliefert hast, ist als Grundlage doch schon
            sehr brauchbar.

            Leider hast du trotz deiner drei Postings noch immer keine für uns
            sinnvolle Problembeschreibung gegeben. Ein "Geht nicht" bringt
            uns ohne genauen Grund nichts. Wie du oben vielleicht bemerkt hast,
            kann ich nur vermuten wo dein Problem liegt.

            Gruß
            Slyh

            1. Hallo Gemeinde,
              das erste Problem ist schon beseitigt, jetzt kommt das zweite, und zwar, wie kann ich Zippen nach bestimmte Volumen beschränken z.B es gibt 5 GB Daten, das soll gezippt werden in 700 MB und als ausgang bekommt man ungefähr 6 bis 7 stück gezippte Daten, backup1.zip,backup2.zip,backup3.zip,backup4.zip,backup5.zip,backup6.zip,backup7.zip. Gibt es möglichkeiten unter package java.util.zip, die ZipEntry() nach Volumen 700 MB beschränken. Ich habe bis jetzt andere alternative benutzt, ich benutze File Splitter und File merger, aber das finde ich unpraktisch, weil wenn ich wieder zusammenführen möchte, müss ich wieder dieselbe File merger benutzt. Dh das geht nicht mit winzip, wenn man wieder zusammenführen möchte.

              Mein dritte Problem, wie kann ich inkrementielle backup machen, das heisst die Inhalte des gezippte Daten soll geändert werden, wenn eine Änderungen gibt oder sogar neue dateien hingezufügen werden.

              Ich bedanke mich für eure Hilfe