/* * Copyright(c) 2005 Center for E-Commerce Infrastructure Development, The * University of Hong Kong (HKU). All Rights Reserved. * * This software is licensed under the GNU GENERAL PUBLIC LICENSE Version 2.0 [1] * * [1] http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt */ package hk.hku.cecid.piazza.commons.util; import hk.hku.cecid.piazza.commons.io.FileSystem; import hk.hku.cecid.piazza.commons.io.IOHandler; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; /** * Zip is a tool which can compress a set of files contained in a directory into * a zip file. Likewise, it can also extract a set of files compressed in a zip * file to a directory. * * @author Hugo Y. K. Lam * */ public final class Zip { /** * Creates a new instance of Zip. */ private Zip() { } /** * Compresses a set of files contained in a directory into a zip file. * * @param toFile the zip file. * @param dir the directory which contains the files to be compressed. * @throws UtilitiesException if there is any error in the compression. */ public static void compress(File toFile, File dir) throws UtilitiesException { try { if (dir == null || !dir.exists() || !dir.isDirectory()) { throw new UtilitiesException("Invalid input directory: " + dir); } FileOutputStream fos = new FileOutputStream(toFile); ZipOutputStream outs = new ZipOutputStream(fos); FileSystem fs = new FileSystem(dir); Iterator allFiles = fs.getFiles(true).iterator(); while (allFiles.hasNext()) { File srcFile = (File) allFiles.next(); String filepath = srcFile.getAbsolutePath(); String dirpath = dir.getAbsolutePath(); String entryName = filepath.substring(dirpath.length() + 1) .replace('\\', '/'); ZipEntry zipEntry = new ZipEntry(entryName); zipEntry.setTime(srcFile.lastModified()); FileInputStream ins = new FileInputStream(srcFile); outs.putNextEntry(zipEntry); IOHandler.pipe(ins, outs); outs.closeEntry(); ins.close(); } outs.close(); } catch (Exception e) { throw new UtilitiesException("Unable to compress zip file: " + toFile, e); } } /** * Extracts a set of files compressed in a zip file to a directory. * * @param fromFile the zip file. * @param dir the directory to which the files to be extracted. Current user * directory will be chosen if it is null. * @throws UtilitiesException if there is any error in the extraction. */ public static void extract(File fromFile, File dir) throws UtilitiesException { try { if (dir == null) { dir = new File(System.getProperty("user.dir")); } else if (!dir.exists()) { dir.mkdirs(); } if (!dir.isDirectory()) { throw new UtilitiesException("Invalid output directory: " + dir); } ZipFile zipFile = new ZipFile(fromFile); ArrayList fileEntries = new ArrayList(); Enumeration zipEntries = zipFile.entries(); while (zipEntries.hasMoreElements()) { ZipEntry zipEntry = (ZipEntry) zipEntries.nextElement(); if (zipEntry.isDirectory()) { new File(dir, zipEntry.getName()).mkdirs(); } else { fileEntries.add(zipEntry); } } Iterator allFiles = fileEntries.iterator(); while (allFiles.hasNext()) { ZipEntry fileEntry = (ZipEntry) allFiles.next(); File destFile = new File(dir, fileEntry.getName()); destFile.setLastModified(fileEntry.getTime()); destFile.getParentFile().mkdirs(); FileOutputStream outs = new FileOutputStream(destFile); InputStream ins = zipFile.getInputStream(fileEntry); IOHandler.pipe(ins, outs); ins.close(); outs.close(); } zipFile.close(); } catch (Exception e) { throw new UtilitiesException("Unable to extract zip file: " + fromFile, e); } } }