Apache Commons Compress解压7z文件时如何保留空文件夹?
解决Apache Commons Compress 1.15解压7z文件时丢失空文件夹的问题
我看了你的代码,问题很明确:你在遍历7z条目时,遇到目录就直接continue跳过了——空文件夹本身就是一个独立的目录条目,但你完全没对它做任何处理,自然不会被创建出来。只有当压缩包内有文件时,你才会创建该文件的父目录,但空文件夹没有对应的文件条目触发父目录创建,所以就被忽略了。
修改后的代码
SevenZFile sevenZFile = new SevenZFile(new File(filename)); SevenZArchiveEntry entry; while ((entry = sevenZFile.getNextEntry()) != null) { File curFile = new File(DestinationPath, entry.getName()); if (entry.isDirectory()) { // 处理目录条目:创建对应的文件夹,包括空文件夹 if (!curFile.exists()) { curFile.mkdirs(); // mkdirs会创建所有必要的父目录 } continue; } // 处理文件条目,保留原有逻辑并优化资源管理 File parent = curFile.getParentFile(); if (!parent.exists()) { parent.mkdirs(); } // 用try-with-resources自动关闭流,避免资源泄漏 try (FileOutputStream out = new FileOutputStream(curFile)) { byte[] content = new byte[(int) entry.getSize()]; sevenZFile.read(content, 0, content.length); out.write(content); } catch (IOException e) { // 可根据需求添加异常处理,比如日志记录或自定义抛出 e.printStackTrace(); } } sevenZFile.close();
关键修改点解释
- 移除了对目录条目的直接跳过,主动创建目录:只要遍历到目录条目,就根据它的路径创建对应的文件夹,这样空文件夹就能被完整保留。
- 优化了流的关闭方式:使用
try-with-resources语法,确保文件输出流会被自动关闭,避免潜在的资源泄漏问题。 mkdirs()方法会自动创建所有不存在的父目录,即使目录嵌套很深也能正常处理。
这样修改后,解压出来的文件结构就会和原7z包完全一致,包括所有空文件夹啦。
内容的提问来源于stack exchange,提问作者Nilesh Morey
相关产品推荐
相关产品推荐

