/* * Created on 10.02.2005 */ package jplagTutorial.util; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; public class ZipUtil { /** * Zips the given directory "dir" into a zip file in "dest" * @param dir File denoting the directory to be zipped * @param dest Name of the directory where the zipped file will be stored, * which will be named dir.getName()+".zip" * @return zipped file */ public static File zip(File dir, String dest) { File zippedFile = new File(dest + "/" + dir.getName() + ".zip"); zipTo(dir, zippedFile); return zippedFile; } /** * Zips the given directory "dir" into the zip file "destFile". * If "destFile" already exists, it will be overwritten * @param dir Directory to be zipped * @param destFile Destination file */ public static void zipTo(File dir, File destFile) { FileOutputStream ops = null; ZipOutputStream zos = null; try { ops = new FileOutputStream(destFile); zos = new ZipOutputStream(ops); zipDir(dir, zos, ""); } catch(FileNotFoundException e) { e.printStackTrace(); } finally { try { if(zos != null) zos.close(); else if(ops != null) ops.close(); } catch(IOException e) { e.printStackTrace(); } } } /** * Recursively zips all files in "dir" and its subdirectories into the given * ZipOutputStream "zos" using the given path prefix for their names */ private static void zipDir(File dir, ZipOutputStream zos, String prefix) { File[] entries = dir.listFiles(); for(int i = 0; i < entries.length; i++) { if(entries[i].isDirectory()) { // generate directory entry ZipEntry zi = new ZipEntry(prefix + "/" + entries[i].getName() + "/"); try { zos.putNextEntry(zi); zos.closeEntry(); } catch(IOException ioex) { ioex.printStackTrace(); } zipDir(entries[i], zos, prefix + "/" + entries[i].getName()); } else { FileInputStream fis = null; try { fis = new FileInputStream(entries[i]); ZipEntry zi = new ZipEntry(prefix + "/" + entries[i].getName()); zos.putNextEntry(zi); copystream(fis, zos); zos.closeEntry(); } catch(FileNotFoundException ex) { ex.printStackTrace(); } catch(IOException ioex) { ioex.printStackTrace(); } finally { try { if(fis != null) fis.close(); } catch(Exception e) {} } } } } /** * Zips all files in "fileVector" to the zipfile "destFile". * The pathnames of all files in fileVector must start with baseDir! * @param fileVector Files to be zipped * @param baseDir Root directory for this zip file * @param destFile Destination file */ public static void zipFilesTo(Vector<File> fileVector, String baseDir, File destFile) { FileOutputStream ops = null; ZipOutputStream zos = null; int basedirlen = baseDir.length(); if(!baseDir.endsWith(File.separator)) basedirlen++; try { ops = new FileOutputStream(destFile); zos = new ZipOutputStream(ops); Iterator<File> iter = fileVector.iterator(); while(iter.hasNext()) { File file = iter.next(); FileInputStream fis = null; try { fis = new FileInputStream(file); String name = file.getPath().substring(basedirlen); name = name.replace('\\', '/'); // Zip uses '/' as separator ZipEntry zi = new ZipEntry(name); zos.putNextEntry(zi); copystream(fis, zos); zos.closeEntry(); } catch(FileNotFoundException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } finally { try { if(fis != null) fis.close(); } catch(Exception e) {} } } } catch(FileNotFoundException e) { e.printStackTrace(); } finally { try { if(zos != null) zos.close(); else if(ops != null) ops.close(); } catch(IOException e) { e.printStackTrace(); } } } /** * Unzips the zip file "file" into the directory "dest" * @param file The zip file * @param destDir Directory where the content of the zip file will be saved */ public static void unzip(File file, File destDir) { destDir.mkdir(); try { ZipFile zipFile = new ZipFile(file); Enumeration entries = zipFile.entries(); while(entries.hasMoreElements()) { ZipEntry ze = (ZipEntry) entries.nextElement(); if(ze.isDirectory()) (new File(destDir, ze.getName())).mkdir(); else { // make sure directories exist in case the client // didn't provide directory entries! File f = new File(destDir, ze.getName()); (new File(f.getParent())).mkdirs(); FileOutputStream fos = null; BufferedOutputStream bos = null; InputStream in = null; try { fos = new FileOutputStream(f); bos = new BufferedOutputStream(fos); in = zipFile.getInputStream(ze); copystream(in, bos); } finally { if(bos != null) bos.close(); else if(fos != null) fos.close(); if(in != null) in.close(); } } } } catch(IOException ioex) { ioex.printStackTrace(); } } /** * Copies the input stream to the output stream using a 1 kB buffer * @throws IOException */ private static void copystream(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; int len; while((len = in.read(buffer)) >= 0) out.write(buffer, 0, len); } public static void main(String[] args) { // zip(new File("/home/bikiri/Desktop/jplag-old"), // "/home/bikiri/Desktop"); unzip(new File("/home/bikiri/Desktop/emma.zip"), new File("/home/bikiri/Desktop","unzipresult")); } }