androidevil
androidevil

Reputation: 9171

How to unzip files do a specific folder in Android?

I am unziping a file based in the official documentation and some examples. My current implementation unzip the file in the same directory where is the zip file. I'd like to unzip to a specific directory in my device. How can I do this? The ZipInputStream allow this feature or do I have to unzip and then move the files to the desired folder?

This is my code:

public static boolean unpackZip(String path, String zipname) {
    InputStream is;
    ZipInputStream zis;
    try {
        String filename;
        is = new FileInputStream(path + zipname);
        zis = new ZipInputStream(new BufferedInputStream(is));
        ZipEntry ze;
        byte[] buffer = new byte[1024];
        int count;

        while ((ze = zis.getNextEntry()) != null) {
            filename = ze.getName();

            if (ze.isDirectory()) {
                File fmd = new File(path + filename);
                fmd.mkdirs();
                continue;
            }

            FileOutputStream fout = new FileOutputStream(path + filename);

            while ((count = zis.read(buffer)) != -1) {
                fout.write(buffer, 0, count);
            }

            fout.close();
            zis.closeEntry();
        }

        zis.close();
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

Upvotes: 0

Views: 1206

Answers (3)

Eli
Eli

Reputation: 626

You need to create the folder by splitting the string:

                if (filename.contains("/")){
                String[] folders = filename.split("/");
                for (String item : folders)
                {
                    File fmd = new File(path + item);
                    if (!item.contains(".") && !fmd.exists()){
                        fmd.mkdirs();
                        Log.d("created folder", item);
                    }
                }
            }

FULL CODE:

public static boolean unpackZip(String path, String zipname) {
InputStream is;
ZipInputStream zis;
try {
    String filename;
    is = new FileInputStream(path + zipname);
    zis = new ZipInputStream(new BufferedInputStream(is));
    ZipEntry ze;
    byte[] buffer = new byte[1024];
    int count;

    while ((ze = zis.getNextEntry()) != null) {
        filename = ze.getName();

        if (ze.isDirectory()) {
            File fmd = new File(path + filename);
            fmd.mkdirs();
            continue;
        }
            //ADD THIS//
            if (filename.contains("/")){
                String[] folders = filename.split("/");
                for (String item : folders)
                {
                    File fmd = new File(path + item);
                    if (!item.contains(".") && !fmd.exists()){
                        fmd.mkdirs();
                        Log.d("created folder", item);
                    }
                }
            }

        FileOutputStream fout = new FileOutputStream(path + filename);

        while ((count = zis.read(buffer)) != -1) {
            fout.write(buffer, 0, count);
        }

        fout.close();
        zis.closeEntry();
    }

    zis.close();
} catch (IOException e) {
    e.printStackTrace();
    return false;
}

return true;

}

Upvotes: 1

ToYonos
ToYonos

Reputation: 16833

Specify a target directory as a parameter. Apart this, your code seems ok.

public static boolean unpackZip(String path, String zipname, String targetDirectory) {
    InputStream is;
    ZipInputStream zis;
    try {
        String filename;
        is = new FileInputStream(path + zipname);
        zis = new ZipInputStream(new BufferedInputStream(is));
        ZipEntry ze;
        byte[] buffer = new byte[1024];
        int count;

        while ((ze = zis.getNextEntry()) != null) {
            filename = ze.getName();

            if (ze.isDirectory()) {
                File fmd = new File(targetDirectory + filename);
                fmd.mkdirs();
                continue;
            }

            FileOutputStream fout = new FileOutputStream(targetDirectory + filename);

            while ((count = zis.read(buffer)) != -1) {
                fout.write(buffer, 0, count);
            }

            fout.close();
            zis.closeEntry();
        }

        zis.close();
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

Upvotes: 0

Ben Pye
Ben Pye

Reputation: 807

Where you open the file as in File fmd = new File(path + filename); and FileOutputStream fout = new FileOutputStream(path + filename); you can simply prepend the target directory as path + filename is simply the path to the file. I'm not sure what you are passing in as path in this case, I assume the path to the zip file, if you wish to extract elsewhere you need to pass in another variable with the target. Something like:

public static boolean unpackZip(String path, String zipname, String outputPath) {
    InputStream is;
    ZipInputStream zis;
    try {
        String filename;
        is = new FileInputStream(path + zipname);
        zis = new ZipInputStream(new BufferedInputStream(is));
        ZipEntry ze;
        byte[] buffer = new byte[1024];
        int count;

        while ((ze = zis.getNextEntry()) != null) {
            filename = ze.getName();

            if (ze.isDirectory()) {
                File fmd = new File(outputPath + filename);
                fmd.mkdirs();
                continue;
            }

            FileOutputStream fout = new FileOutputStream(outputPath + filename);

            while ((count = zis.read(buffer)) != -1) {
                fout.write(buffer, 0, count);
            }

            fout.close();
            zis.closeEntry();
        }

        zis.close();
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

Upvotes: 0

Related Questions