/* * The MIT License (MIT) * * Copyright (c) 2007-2015 Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.broad.igv.data; import org.broad.igv.util.FileUtils; import java.io.*; import java.util.zip.CRC32; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * @author jrobinso */ public class ZipUtils { public static void zipDirectory(File dir2Zip, File outputFile) { try { //create a ZipOutputStream to zip the data to ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outputFile)); //assuming that there is a directory named inFolder (If there //isn't create one) in the same directory as the one the code //call the zipDir method zipDirRecursive(dir2Zip, dir2Zip, zos); //close the stream zos.close(); } catch (Exception e) { e.printStackTrace(); } } //here is the code for the method public static void zipDirRecursive(File zipDir, File currentDir, ZipOutputStream zos) { try { //create a new File object based on the directory we have to zip //get a listing of the directory content String[] dirList = zipDir.list(); byte[] readBuffer = new byte[2156]; int bytesIn = 0; //loop through dirList, and zip the files for (File f : currentDir.listFiles()) { if (f.isDirectory()) { //if the File object is a directory, call this //function again to add its content recursively zipDirRecursive(zipDir, f, zos); //loop again continue; } else { //if we reached here, the File object f was not a directory //create a FileInputStream on top of f FileInputStream fis = new FileInputStream(f); //create a new zipentry. Use a relative path String relativePath = FileUtils.getRelativePath(zipDir.getAbsolutePath(), f.getAbsolutePath(), System.getProperty("file.separator")); String piPath = FileUtils.getPlatformIndependentPath(relativePath); if (piPath.startsWith("./")) { piPath = piPath.substring(2); } ZipEntry anEntry = new ZipEntry(piPath); anEntry.setMethod(ZipEntry.STORED); anEntry.setCompressedSize(f.length()); anEntry.setSize(f.length()); anEntry.setCrc(getCrc(f)); zos.putNextEntry(anEntry); //now write the content of the file to the ZipOutputStream while ((bytesIn = fis.read(readBuffer)) != -1) { zos.write(readBuffer, 0, bytesIn); } //close the Stream fis.close(); } } } catch (Exception e) { e.printStackTrace(); } } private static long getCrc(File file) throws IOException { CRC32 crc = new CRC32(); crc.reset(); byte[] buffer = new byte[1024]; int bytesRead = 0; BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); while ((bytesRead = bis.read(buffer)) != -1) { crc.update(buffer, 0, bytesRead); } bis.close(); return crc.getValue(); } }