Ordnerinhalt in Zip-Datei packen

Kai008

Erfahrenes Mitglied
Ich will einen Ordnerinhalt in eine ZipDatei packen.
Leider es so wie ich es habe nicht.

Java:
public static boolean zip(File directory)
{
	boolean result = false;
	
	try
	{
		File[] fileList = directory.listFiles();
		for(File albumDirs:fileList)
		{
			File[] albumDirFileList = albumDirs.listFiles();
			for(File file:albumDirFileList)
			{
				FileOutputStream fos = new FileOutputStream(
						Zipper.ZIP_FILE);
				ZipOutputStream zos = new ZipOutputStream(fos);

				FileInputStream fis = new FileInputStream(file);
				byte[] buffer = new byte[8192];

				for(int length; (length = fis.read(buffer)) != -1;)
					zos.write(buffer, 0, length);
				
				zos.flush();
				fis.close();
				zos.close();
				fos.close();
			}
		}
		result = true;
    }
    catch(Exception e){e.printStackTrace();}
    return(result);
}

Java:
java.util.zip.ZipException: no current ZIP entry
	at java.util.zip.ZipOutputStream.write(Unknown Source)
	at core.Zipper.zip(Zipper.java:106) (for(int length;.....)
	at core.NewAlbumWindow$5$1$1.run(NewAlbumWindow.java:142)

Kann mir wer bitte den Mist hier ausbessern?

Der Parm enthält den Ordner, dessen Inhalt gepackt werden soll. Darin sind auch nur Ordner, in denen sich jeweils eine Variable Anzahl Bilder befinden.
 
ich habe deine Klasse ein wenig umgestrickt - jetzt wird die übergebene directory komplett ausgelesen - also mit allen Unterordnern: ich übergebe der Methode "getAllFiles" ein directory - diese ermittelt von sämtlichen darin befindlichen Dateien die absoluten Pfade - durch Rekursion auch die der Unterordner. Diese werden in einer LinkedList zurückgegeben und dann von der Methode "zip" abgearbeitet.

Mit "outFilename" vergebe ich auch einen absoluten Pfad der zu erstellenden zip-Datei.


Java:
package appl;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFile {

	public static boolean zip(File directory) {
		
		boolean result = false;
		
		byte[] buffer = new byte[8192];
		
			try {
				
				LinkedList<String> fileList = getAllFiles(directory);
				
				String outFilename = "D:\\outfile.zip";
				FileOutputStream fos = new FileOutputStream(outFilename);
				ZipOutputStream zos = new ZipOutputStream(fos);
				
				for (String fileName : fileList) {
					
					FileInputStream fis = new FileInputStream(fileName);
					zos.putNextEntry(new ZipEntry(fileName));
					
					int length;
					while ((length = fis.read(buffer)) > 0) {
						zos.write(buffer, 0, length);
					}
					
					zos.closeEntry();
					fis.close();
				}	
				
				zos.close();
				fos.close();
				
				result = true;
				
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	
		return result;
		
	}
	
	
	/**
	 * Methode legt alle Datei-Pfade in einer LinkedList ab - mit allen Unterordnern
	 * @param files
	 * @return
	 */
	private static LinkedList<String> getAllFiles(File directory) {
		
		File[] files = directory.listFiles();
		
		LinkedList<String> allFiles = new LinkedList<String>();
		
		for (File file : files) {
			
			if (file.isDirectory()) {
				LinkedList<String> moreFiles = getAllFiles(file);
				Iterator<String> iterMoreFiles = moreFiles.iterator();
				while(iterMoreFiles.hasNext()) {
					allFiles.add(iterMoreFiles.next());
				}
				
			} else {
				allFiles.add(file.getAbsolutePath());
			}	
		}
		
		return allFiles;
	}
}


Meine Main sieht so aus:

Java:
	public static void main(String[] args) {
		
		File directory = new File("D:\\test\\");
		ZipFile.zip(directory);
	}

Der Code klappt soweit bei mir! Ich hoffe, dass hilft dir weiter!
 
Zuletzt bearbeitet:
Zurück