Zippen mehrere Dateien und Directory nach einem Ausgang
brusli
- java
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
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,
- 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.
- 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.
- 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
Hallo,
- 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.
- 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.
- 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
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
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.
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
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
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