Unzip in Java mit Verzeichnissen

AlexD1979

Erfahrenes Mitglied
Hallo!

Ich habe mir da was zusammengestellt zum unzippen von Archiven mit Java. Leider sind in den Archiven die Dateien mit voller Pfadangabe gespeichert und mein Programm kann diese einfach nicht anlegen. Es gibt immer eine Fehlermeldung:

C:\Programme\eclipse\workspace\JavaZip>java jUnzip test.zip
Extracting file: sites/gsnmbx/site/live/cgi-bin/temp/xdwtpmne1057239591/C-0MGK0-
0BF-004.pdf

Unhandled exception:
java.io.FileNotFoundException: sites\gsnmbx\site\live\cgi-bin\temp\xdwtpmne10572
39591\C-0MGK0-0BF-004.pdf (Das System kann den angegebenen Pfad nicht finden)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at jUnzip.main(jUnzip.java:46)


Ich brauche nur noch die Funktion, dass die Dateien nicht in das Verzeichnis ausgepackt werden sollen, in dem sie gespeichert wurden, sondern dass ich dem Javaprogramm ein (existierendes) Verzeichnis mitgeben kann, wohin er die Dateien entpacken kann.


Code:
import java.io.*;
import java.util.*;
import java.util.zip.*;

public class jUnzip {

	public static final void copyInputStream(InputStream in, OutputStream out)
			throws IOException {
		byte[] buffer = new byte[1024];
		int len;

		while ((len = in.read(buffer)) >= 0)
			out.write(buffer, 0, len);

		in.close();
		out.close();
	}

	public static final void main(String[] args) {
		Enumeration entries;
		ZipFile zipFile;

		if (args.length != 1) {
			System.err.println("Usage: Unzip zipfile");
			return;
		}

		try {
			zipFile = new ZipFile(args[0]);
			entries = zipFile.entries();

			while (entries.hasMoreElements()) {
				ZipEntry entry = (ZipEntry) entries.nextElement();

				if (entry.isDirectory()) {
					System.err.println("Extracting directory: "
							+ entry.getName());
					// This is not robust, just for demonstration purposes.
					(new File(entry.getName())).mkdir();
					continue;
				}

				System.err.println("Extracting file: " + entry.getName());
				copyInputStream(zipFile.getInputStream(entry),
						new BufferedOutputStream(new FileOutputStream(entry
								.getName())));
			}

			zipFile.close();
		} catch (IOException ioe) {
			System.err.println("Unhandled exception:");
			ioe.printStackTrace();
			return;
		}
	}

}
 
Hallo!

Versuchs mal hiermit:

Code:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;


public class Zipper {

	public static void main(String[] args) {

		if (args.length != 2) {
			System.out.println("Usage: java Zipper filename.zip destdir");
			return;
		}

		String zipFile = args[0];
		String destDir = args[1];

		File file = new File(destDir);
		file.mkdirs();

		try {
			ZipFile zip = new ZipFile(zipFile);

			Enumeration e = zip.entries();

			while (e.hasMoreElements()) {
				ZipEntry entry = (ZipEntry) e.nextElement();

				System.out.println("Entpacke: " + entry.getName());

				File f = new File(destDir + File.separatorChar
						+ entry.getName());
				
				if (entry.isDirectory())
					f.mkdirs();
				
				System.out.println(f);
				if(!f.exists()){
					File parent = new File(f.getParent());
					parent.mkdirs();
					
					f.createNewFile();
				}

				InputStream is = zip.getInputStream(entry);

				byte[] buffer = new byte[2048];

				if (!f.isDirectory()) {
					FileOutputStream fos = new FileOutputStream(f);
				
					int len = 0;
					
					while ((len = is.read(buffer)) != -1) {
						fos.write(buffer,0,len);
					}

					fos.flush();
					fos.close();
					is.close();
				}
			}
			zip.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Beispiel Aufruf:

Code:
java Zipper D:\eclipse\workspace\tutorials\src\de\tutorials\SYTest.zip d:\tmp

Gruß Tom
 
Grüß dich!
Danke für das Codebeispiel. Das ist es fast, was ich suche.
Ich muss es irgendwie schaffen, das er die Pfade im Zip ignoriert. Denn er soll es in einem speziellen Pfad (z.B. D:\tmp) entpacken, ohen Unterverzeichnisse zu erstellen.

Irgendwie muss also das mkdirs() wieder weg und der Pfad "ausgeschnitten" werden, dass nur noch der Dateiname übergeben wird an den Unzipper.
 
Hallo!

Meinst du sowas?

Code:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class Zipper {

	public static void main(String[] args) {

		if (args.length != 2) {
			System.out.println("Usage: java Zipper filename.zip destdir");
			return;
		}

		String zipFile = args[0];
		String destDir = args[1];

		File file = new File(destDir);
		file.mkdirs();

		try {
			ZipFile zip = new ZipFile(zipFile);
 
			Enumeration e = zip.entries();

			while (e.hasMoreElements()) {
				ZipEntry entry = (ZipEntry) e.nextElement();

				String fileName = entry.getName();

				File f = new File(destDir + File.separatorChar
						+ fileName.substring(fileName.lastIndexOf('/') + 1));

				if (!f.exists()) {
					f.createNewFile();
				}

				InputStream is = zip.getInputStream(entry);

				byte[] buffer = new byte[2048];

				if (!f.isDirectory()) {
					System.out.println("Entpacke: " + f.getName());
					FileOutputStream fos = new FileOutputStream(f);

					int len = 0;

					while ((len = is.read(buffer)) != -1) {
						fos.write(buffer, 0, len);
					}

					fos.flush();
					fos.close();
					is.close();
				}
			}
			zip.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Gruß Tom
 
Ja!
Genau! Das meinte ich! Cool!

Also manchmal hat man echt ein Brett vor dem Kopf. Ich habe da schon die kompliziertesten Methoden zu geschrieben um das hinzubekommen.

Danke!

Gruß
Alex
 
Zurück