2

首先,我用谷歌搜索了很多次,搜索了一大堆 Stackoverflow 页面,但我什么也做不了。我想要做的是我有一个结构如下的 zip 文件:

压缩文件.zip

文件夹

子文件夹 1

带空格的子文件夹(大约 100 个,但数量不详)

带有空格的子子文件夹

几个文件

SubSubFolderWithoutSpaces

还有几个文件

子文件夹 2

带空格的子文件夹(大约 100 个,但数量不详)

带有空格的子子文件夹

几个文件

SubSubFolderWithoutSpaces

还有几个文件

子文件夹 3

带空格的子文件夹(大约 100 个,但数量不详)

带有空格的子子文件夹

几个文件

SubSubFolderWithoutSpaces

还有几个文件

子文件夹4

带空格的子文件夹(大约 100 个,但数量不详)

带有空格的子子文件夹

几个文件

SubSubFolderWithoutSpaces

还有几个文件

我目前正在使用来自http://www.jondev.net/articles/Unzipping_Files_with_Android_%28Programmatically%29的代码来尝试解压缩文件,但它所做的只是创建一个名为 zipfile 的目录,然后在其中有一个子目录称为文件夹,目录中没有任何内容,这显然不应该发生。

任何帮助将非常感激。

更新:哦,如果你想知道我确实有 WRITE_EXTERNAL_STORAGE_PERMISSION。

4

1 回答 1

5

我希望这可以帮助你:

private boolean unzipPack(InputStream stream) {
    FileOutputStream out;
    byte buf[] = new byte[16384];
    try {
        ZipInputStream zis = new ZipInputStream(stream);
        ZipEntry entry = zis.getNextEntry();
        while (entry != null) {
            if (entry.isDirectory()) {
                File newDir = new File(rootDirectory + entry.getName());
                newDir.mkdir();
            } else {
                String name = entry.getName();
                File outputFile = new File(rootDirectory + name);
                String outputPath = outputFile.getCanonicalPath();
                name = outputPath
                .substring(outputPath.lastIndexOf("/") + 1);
                outputPath = outputPath.substring(0, outputPath
                .lastIndexOf("/"));
                File outputDir = new File(outputPath);
                outputDir.mkdirs();
                outputFile = new File(outputPath, name);
                outputFile.createNewFile();
                out = new FileOutputStream(outputFile);

                int numread = 0;
                do {
                    numread = zis.read(buf);
                    if (numread <= 0) {
                        break;
                    } else {
                        out.write(buf, 0, numread);
                    }
                } while (true);
                out.close();
            }
            entry = zis.getNextEntry();
        }
        return true;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}      

参考
android pico installer source

于 2012-06-30T04:40:23.473 回答