0

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

知道为什么吗?以及如何解决它

 File outFile = new File(out_zip);

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();
4

1 回答 1

0

似乎是“zip4j”中的一个错误。

这是因为“Zip4jUtil”类中的这种逻辑。对于 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”类中创建实际的拆分文件时,逻辑可以很好地生成正确的文件名。下面的代码将生成“.z10”文件而不是“.z010”。

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

所以文件创建很好,问题在于列出文件时的逻辑。

解决方案:

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

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

于 2015-05-01T15:29:08.950 回答