Problem beim erstellen von ZIP file

mcbass

Mitglied
Hi

Ich habe mir eine methode gebastelt, die ein Verzeichnis durch recursion zipped. Das klappt auch wunderbar, aber dummerweise sind dann alle files mit dem entsprechendem Pfad in der zipdatei. Wenn ich das Teil wieder entpacke habe ich dann den ganze Pfad da stehen.

z.B.:

Habe ein Verzeichnis unter C:\Arbeitsverzeichnis\sonstiges\nochwas\publish\1234
und ich will das verzeichnis 1234 (und alles da drunter) packen und die datei unter publish ablegen. Wenn ich das jetzt machen, und die datei im selben verzeichnis wieder auspacke bekomme ich das hier : C:\Arbeitsverzeichnis\sonstiges\nochwas\publish\C:\Arbeitsverzeichnis\sonstiges\nochwas\publish\1234

Das ist ziemlich daneben. Hat jemand eine idee ?

Code:
  public static void zipDir (String folder, String zipfile) {
		try {
			ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipfile));
			compressFolder(folder, zos);
			zos.close();
		 } catch (Exception e) {
		 }
	 }

	//  here is the recursive method 
	public static void compressFolder (
						String folder,
						ZipOutputStream zos
					   ) {
		try {
			File zipDir = new File(folder);
			String[] dirList = zipDir.list();
			byte[] readBuffer = new byte[2156];
			int bytesIn = 0;

			//loop through dirList, and zip the files 
			for (int i = 0; i < dirList.length; i++) {
				File f = new File(zipDir, dirList[i]);

				if (f.isDirectory()) {
					String filePath = f.getPath();
					compressFolder(filePath, zos);
					continue;
				 }
				FileInputStream fis = new FileInputStream(f);
				ZipEntry anEntry = new ZipEntry(f.getPath());
				zos.putNextEntry(anEntry);
				while ((bytesIn = fis.read(readBuffer)) != -1) {
					zos.write(readBuffer, 0, bytesIn);
				 }
				fis.close();
			 }
		 } catch (Exception e) {
		 }
	 }

Sebastian
 
Du legst das Entry mit dem Kompletten Pfad an, d.h. es wird mit dem kompletten Pfad in der ZipFile gespeichert. du solltest das so machen, dass du das Entry mit dem Pfad ab dem Ordner anlegst.

MFG sash
 
Hallo!

Wie wär's denn damit?
Code:
/**
  * 
  */
 package de.tutorials;
 
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
 /**
  * @author Tom
  * 
  */
 public class CompressFolderExample {
 
 	static byte[] buffer = new byte[8192];
 	static int len = 0;
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
 		ZipOutputStream zipOutputStream = new ZipOutputStream(
 				new FileOutputStream("C:/sj644.zip"));
 		File file = new File("c:/sj644");
 		treeWalkAndCompressTo(file, zipOutputStream);
 		zipOutputStream.close();
 
 	}
 
 	private static void treeWalkAndCompressTo(File file,
 			ZipOutputStream zipOutputStream) throws Exception {
 		if (!file.isDirectory()) {
 			ZipEntry entry = new ZipEntry(file.getAbsolutePath());
 			zipOutputStream.putNextEntry(entry);
 			
 			FileInputStream fis = new FileInputStream(file);
 			while ((len = fis.read(buffer)) > 0) {
 				zipOutputStream.write(buffer, 0, len);
 			}
 			fis.close();
 			zipOutputStream.closeEntry();
 		} else {
 			File[] children = file.listFiles();
 			for (int i = 0; i < children.length; i++) {
 				File child = children[i];
 				treeWalkAndCompressTo(child, zipOutputStream);
 			}
 		}
 	}
 }

Gruß Tom
 
@Thomas Darimont
Habe eine Frage zu deinem Code.
Das zippen funktioniert wunderbar, allerdings speichert er den kompletten Pfad. Wie kann ich das verhindern?

Also wenn ich eine zip- Datei von dem Verzeichnis d:\meineDateien\Bilder\tmp\ erstelle und dann versuche mit Winrar zu entpacken muss ich mich durch den ganzen Verzeichnisbaum durchklicken.
Ich würde mir das ganze ersparen wollen d.h. wenn ich meine Zip-Datei öffne würde ich dann gerne beim untersten Verzeichnis beginnen wollen, also das ich gleich den Inhalt von \tmp\ sehe. Wie kann ich das am Besten anstellen?

Ich hoffe das ich meine Frage versrändlich formuliert habe.
 
Hallo,
das ist zwar genau ein Jahr her, aber ich habe das gleiche Problem.
Der Code von Thomas funktioniert einwandfrei, nur werden im Archiv komplette Verzeichnissbäume mitgespeichert.
Durch
Code:
file.getAbsolutePath()
entstehen im Archiv nicht erwünschte Verzeichnisse.

Wie kann man das umgehen?
 
Problem gelöst!

Code:
private final static String GENERATOR = "generator";

String f = file.getAbsolutePath().substring(file.getAbsolutePath().indexOf(GENERATOR),file.getAbsolutePath().length());
System.out.println(f);
ZipEntry entry = new ZipEntry(f);
 
Hallo!

Ich habe dasselbe Problem wie die User z-coupe und Andron. Allerdings lässt sich bei mir das Problem mit Androns Lösung nicht beheben, da ich immer folgende Fehlermeldung bekomme:

An error occured:ZIP file must have at least one entry

Gibt es noch eine andere Lösung?

Mein code:

Code:
System.out.println(f.getAbsolutePath().indexOf(GENERATOR)); //Ausgabe -1
System.out.println(f.getAbsolutePath().length()); //48
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().indexOf(GENERATOR), f.getAbsolutePath().length()));
ZipEntry anEntry = new ZipEntry(f.getAbsolutePath().substring(f.getAbsolutePath().indexOf(GENERATOR), f.getAbsolutePath().length()));

Ich arbeite mit Eclipse 3.3 unter Windows.
 
Hi,
hier meine Lösung um relative Pfade in der ZipDatei zu haben.
Habe einfach ein paar Zeilen in der oben geposteten Lösung geändert..

Code:
public class Zipper {

	static byte[] buffer = new byte[8192];
 	static int len = 0;
 	static String relateTo;
 	
 	
 
 	public static void main(String[] args) throws Exception {
 		
 		ZipOutputStream zipOutputStream = new ZipOutputStream(
 				new FileOutputStream("/home/user/zip.zip"));
 		File file = new File("/home/user/test/");
 		treeWalkAndCompressTo(file, file.getParentFile().toURI(), zipOutputStream);
 		zipOutputStream.close();
 
 	}
 	
 	
 	private static void treeWalkAndCompressTo(File file,
 			URI relateTo,
 			ZipOutputStream zipOutputStream) throws Exception {
 		
 		if (!file.isDirectory()) {
 			URI relativePath = relateTo.relativize(file.toURI());
 			ZipEntry entry = new ZipEntry(relativePath.toString());
 			zipOutputStream.putNextEntry(entry);
 			
 			FileInputStream fis = new FileInputStream(file);
 			while ((len = fis.read(buffer)) > 0) {
 				zipOutputStream.write(buffer, 0, len);
 			}
 			fis.close();
 			zipOutputStream.closeEntry();
 		} else {
 			File[] children = file.listFiles();
 			for (int i = 0; i < children.length; i++) {
 				File child = children[i];
 				treeWalkAndCompressTo(child, relateTo, zipOutputStream);
 			}
 		}
 	}
}
 
Zurück