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 文件并在您的应用程序中使用它。
调用
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 文件并在您的应用程序中使用它。