用org.apache.commons.compress的TarArchiveInput/OutputStream压缩文件夹时发现:如果欲压缩/mnt/sdcard下的abc文件夹,结果压缩后的文件里面,也就是解压后展开看到的第一级是个mnt文件夹,进去很空,仅有sdcard文件夹,再进去才是abc文件夹及其子文件夹。而我们想要的是展开第一级就是abc文件夹。
看了源码后发现是TarArchiveEntry的name属性控制打进tar包的目录树结构。而在android的文件系统里面也不好通过相对路径表示文件。所以我在构建TarArchiveEntry时把name中所属目录树剔除:
private static TarArchiveEntry createTarArchiveEntry(File file) {
return new TarArchiveEntry(file, file.getPath().replace(mCompressSrcParentPath, ""));
}
另外在遍历目录树时对于空文件夹,其路径也要放进TarArchiveEntry,即对listFiles返回空数组的file也要构建TarArchiveEntry,并将此TarArchiveEntry放进TarArchiveOutputStream中。否则不会压缩内容为空的文件夹。
写了一个工具类,也把commons-compress源代码压进去了, 经测试可以压缩android上指定文件夹,并解压到指定路径。