package com.njlabs.showjava.utils; import android.os.Environment; import com.njlabs.showjava.utils.logging.Ln; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; public class ZipUtils { public static File zipDir(File dir, String packageId){ File zipIntoDir = new File(Environment.getExternalStorageDirectory() + "/ShowJava/archives/"); if(!zipIntoDir.exists() || !zipIntoDir.isDirectory()){ zipIntoDir.mkdirs(); } File zipFile = new File(zipIntoDir, packageId+".zip"); if(zipFile.exists()) { zipFile.delete(); } try { ZipOutputStream zip; FileOutputStream fileWriter; fileWriter = new FileOutputStream(zipFile); zip = new ZipOutputStream(fileWriter); addFolderToZip("", dir.toString(), zip); zip.flush(); zip.close(); } catch (Exception e) { Ln.e(e); } return zipFile; } static private void addFileToZip(String path, String srcFile, ZipOutputStream zip) throws Exception { File folder = new File(srcFile); if (folder.isDirectory()) { addFolderToZip(path, srcFile, zip); } else { byte[] buf = new byte[1024]; int len; FileInputStream in = new FileInputStream(srcFile); zip.putNextEntry(new ZipEntry(path + "/" + folder.getName())); while ((len = in.read(buf)) > 0) { zip.write(buf, 0, len); } } } static private void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws Exception { File folder = new File(srcFolder); for (String fileName : folder.list()) { if (path.equals("")) { addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip); } else { addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip); } } } public static void unzip(File zipFile, File targetDirectory) throws IOException { unzip(zipFile, targetDirectory, System.out); } public static void unzip(File zipFile, File targetDirectory, PrintStream printStream) throws IOException { ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFile))); try { ZipEntry ze; int count; byte[] buffer = new byte[8192]; while ((ze = zis.getNextEntry()) != null) { File file = new File(targetDirectory, ze.getName()); printStream.println(ze.getName()); File dir = ze.isDirectory() ? file : file.getParentFile(); if (!dir.isDirectory() && !dir.mkdirs()){ throw new FileNotFoundException("Failed to ensure directory: " + dir.getAbsolutePath()); } if (ze.isDirectory()) { continue; } FileOutputStream fout = new FileOutputStream(file); try { while ((count = zis.read(buffer)) != -1) fout.write(buffer, 0, count); } finally { fout.close(); } long time = ze.getTime(); if (time > 0) { file.setLastModified(time); } } } finally { zis.close(); } } }