Zip4j:拆分的名称不匹配

Zip4j: Name mismatch for splits

调用
createZipFileFromFolder(source, parameters, true, splitSize)
后生成的文件名称与物理名称不匹配 BUT 仅适用于拆分文件编号 10。因此函数生成的名称 getSplitZipFiles() 将是 'filename.z010' 而真正的文件名存储是 'filename.z10'。

知道为什么吗?以及如何修复它

 File outFile = new File(out_zip);</p>

ZipFile zipFile = new ZipFile(out_zip);
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
zipFile.createZipFileFromFolder(source, parameters, true, splitSize);
splitZipFiles = zipFile.getSplitZipFiles();

似乎是 'zip4j' 中的错误。

就是因为'Zip4jUtil'class中的这个逻辑。对于文件号 9,if 条件失败,但 fileExt 仍然是 '.z0' 并向文件名添加 +1。相反,条件应该是 if(i>=9) 以匹配文件创建逻辑。

for (int i = 0; i <= numberOfThisDisk; i++) {
                if (i == numberOfThisDisk) {
                    retList.add(zipModel.getZipFile());
                } else {
                    String fileExt = ".z0";
                    if (i > 9) {
                        fileExt = ".z";
                    }
                    partFile = (zipFileName.indexOf(".") >= 0) ? currZipFile.substring(0, currZipFile.lastIndexOf(".")) : currZipFile;
                    partFile = partFile + fileExt + (i + 1);
                    retList.add(partFile);
                }
            }

但是在 'SplitOutputStream' class 中创建实际的拆分文件时,逻辑可以很好地生成正确的文件名。下面的代码将生成“.z10”文件而不是“.z010”。

if (currSplitFileCounter < 9) {
            currSplitFile = new File(parentPath + zipFileWithoutExt + ".z0" + (currSplitFileCounter + 1));
        } else {
            currSplitFile = new File(parentPath + zipFileWithoutExt + ".z" + (currSplitFileCounter + 1));
        }

所以文件创建没问题,问题出在列出文件时的逻辑上。

解决方案:

1) 将错误报告提交给开发团队,同时从http://www.lingala.net/zip4j/download.php.

中获取'zip4j'的源代码

2) 然后更改逻辑 if(i>9) to if(i>=9) in 'Zip4jUtil.java' @ line: 690。创建二进制 .jar 文件并在您的应用程序中使用它。