You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:11:01