Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

zip/compress a folder full of files on android

I need to zip up a "project" folder to allow users to share projects via email. I found a class for zipping up multiple files into one zip, but I need to keep the folder structure in my zip. Is there any way to achieve this on android? Thanks in advance.

like image 941
Mark Avatar asked Jul 13 '11 18:07

Mark


People also ask

How do I zip a lot of files at once?

Right-click on the file or folder. Select “Compressed (zipped) folder”. To place multiple files into a zip folder, select all of the files while hitting the Ctrl button. Then, right-click on one of the files, move your cursor over the “Send to” option and select “Compressed (zipped) folder”.


3 Answers

This code should do the trick.

Note: you must add file write permissions to your app by adding the WRITE_EXTERNAL_STORAGE permission to your manifest.xml file.

/*  *   * Zips a file at a location and places the resulting zip file at the toLocation  * Example: zipFileAtPath("downloads/myfolder", "downloads/myFolder.zip");  */  public boolean zipFileAtPath(String sourcePath, String toLocation) {     final int BUFFER = 2048;      File sourceFile = new File(sourcePath);     try {         BufferedInputStream origin = null;         FileOutputStream dest = new FileOutputStream(toLocation);         ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(                 dest));         if (sourceFile.isDirectory()) {             zipSubFolder(out, sourceFile, sourceFile.getParent().length());         } else {             byte data[] = new byte[BUFFER];             FileInputStream fi = new FileInputStream(sourcePath);             origin = new BufferedInputStream(fi, BUFFER);             ZipEntry entry = new ZipEntry(getLastPathComponent(sourcePath));             entry.setTime(sourceFile.lastModified()); // to keep modification time after unzipping             out.putNextEntry(entry);             int count;             while ((count = origin.read(data, 0, BUFFER)) != -1) {                 out.write(data, 0, count);             }         }         out.close();     } catch (Exception e) {         e.printStackTrace();         return false;     }     return true; }  /*  *   * Zips a subfolder  *   */  private void zipSubFolder(ZipOutputStream out, File folder,         int basePathLength) throws IOException {      final int BUFFER = 2048;      File[] fileList = folder.listFiles();     BufferedInputStream origin = null;     for (File file : fileList) {         if (file.isDirectory()) {             zipSubFolder(out, file, basePathLength);         } else {             byte data[] = new byte[BUFFER];             String unmodifiedFilePath = file.getPath();             String relativePath = unmodifiedFilePath                     .substring(basePathLength);             FileInputStream fi = new FileInputStream(unmodifiedFilePath);             origin = new BufferedInputStream(fi, BUFFER);             ZipEntry entry = new ZipEntry(relativePath);             entry.setTime(file.lastModified()); // to keep modification time after unzipping             out.putNextEntry(entry);             int count;             while ((count = origin.read(data, 0, BUFFER)) != -1) {                 out.write(data, 0, count);             }             origin.close();         }     } }  /*  * gets the last path component  *   * Example: getLastPathComponent("downloads/example/fileToZip");  * Result: "fileToZip"  */ public String getLastPathComponent(String filePath) {     String[] segments = filePath.split("/");     if (segments.length == 0)         return "";     String lastPathComponent = segments[segments.length - 1];     return lastPathComponent; } 
like image 171
HailZeon Avatar answered Sep 24 '22 22:09

HailZeon


I have reworked the code from HailZeon to work properly under windows. Zip Entries must be closed before new ones are started and a starting "/" at entry names like "/file.txt" makes also problems

/**
 * Zips a Folder to "[Folder].zip"
 * @param toZipFolder Folder to be zipped
 * @return the resulting ZipFile
 */
public static File zipFolder(File toZipFolder) {
    File ZipFile = new File(toZipFolder.getParent(), format("%s.zip", toZipFolder.getName()));
    try {
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(ZipFile));
        zipSubFolder(out, toZipFolder, toZipFolder.getPath().length());
        out.close();
        return ZipFile;
    } catch (Exception ex) {
        ex.printStackTrace();
        return null;
    }
}

/**
 * Main zip Function
 * @param out Target ZipStream
 * @param folder Folder to be zipped
 * @param basePathLength Length of original Folder Path (for recursion)
 */
private static void zipSubFolder(ZipOutputStream out, File folder, int basePathLength) throws IOException {

    final int BUFFER = 2048;

    File[] fileList = folder.listFiles();
    BufferedInputStream origin = null;
    for (File file : fileList) {
        if (file.isDirectory()) {
            zipSubFolder(out, file, basePathLength);
        } else {
            byte data[] = new byte[BUFFER];

            String unmodifiedFilePath = file.getPath();
            String relativePath = unmodifiedFilePath.substring(basePathLength + 1);

            FileInputStream fi = new FileInputStream(unmodifiedFilePath);
            origin = new BufferedInputStream(fi, BUFFER);

            ZipEntry entry = new ZipEntry(relativePath);
            entry.setTime(file.lastModified()); // to keep modification time after unzipping
            out.putNextEntry(entry);

            int count;
            while ((count = origin.read(data, 0, BUFFER)) != -1) {
                out.write(data, 0, count);
            }
            origin.close();
            out.closeEntry();
        }
    }
}
like image 33
save_jeff Avatar answered Sep 23 '22 22:09

save_jeff


this is how I do it:

private static void zipFolder(String inputFolderPath, String outZipPath) {
    try {
        FileOutputStream fos = new FileOutputStream(outZipPath);
        ZipOutputStream zos = new ZipOutputStream(fos);
        File srcFile = new File(inputFolderPath);
        File[] files = srcFile.listFiles();
        Log.d("", "Zip directory: " + srcFile.getName());
        for (int i = 0; i < files.length; i++) {
            Log.d("", "Adding file: " + files[i].getName());
            byte[] buffer = new byte[1024];
            FileInputStream fis = new FileInputStream(files[i]);
            zos.putNextEntry(new ZipEntry(files[i].getName()));
            int length;
            while ((length = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, length);
            }
            zos.closeEntry();
            fis.close();
        }
        zos.close();
    } catch (IOException ioe) {
        Log.e("", ioe.getMessage());
    }
}
like image 39
SpyZip Avatar answered Sep 24 '22 22:09

SpyZip