提取的ZIP文件失败-没有文件里面,并有.zip25扩展后提取



我试图从我的Linux中提取ZIP文件,我能够提取它,但预期的输出失败/错误。解压文件里面突然没有文件,解压的文件夹扩展名为.zip25。我搜索了一下,有人说它被损坏了。但是,我不认为它是损坏的,因为我能够在本地(Windows目录)完美地打开和提取zip文件。

的例子:

压缩文件:FolderZip.zip

extract后:FolderZip。zip25(注意:这已经被提取,但仍然有。zip25扩展名,而且里面的文件也丢失了)。

下面是我的代码,我已经做了将近一个月了,但仍然不能弄清楚。有人能帮我弄清楚我做错了什么吗?

public void unZipFolder(String zipFile, String outputFolder){
byte[] buffer = new byte[1024];
System.out.println("ZipFileLocation: " + zipFile);
LOG.info(" ZipFileLocation: " + zipFile);
File folder = new File(outputFolder);
if(!folder.exists())folder.mkdirs();
try{
FileInputStream fis = new FileInputStream(zipFile);
ZipInputStream zis = new ZipInputStream(fis);
ZipEntry ze = zis.getNextEntry();

while(ze != null) {
new File(folder.getParent()).mkdirs();
FileOutputStream fos = new FileOutputStream(folder);
File newFile = new File(outputFolder + FilenameUtils.indexOfLastSeparator(ze.getName()));

if (ze.isDirectory()) {
if (!newFile.isDirectory() && !newFile.mkdirs()) {
throw new IOException("Failed to create directory " + newFile);
}else if(ze.isDirectory()){
newFile.mkdirs();
continue;
}else{
int len;
while ((len = zis.read(buffer)) >= 0) {
fos.write(buffer, 0, len);
}

System.out.println("File Unzip: " + newFile);
LOG.info(" File Unzip: " + newFile);
newFile.mkdirs();
fos.close();
zis.closeEntry();
ze = zis.getNextEntry();
}
}    

boolean result = Files.deleteIfExists(Paths.get(zipFile));
if (result) {
System.out.println("ZipFile is deleted....");
} else {
System.out.println("Unable to delete the file.....");
}
}
zis.closeEntry();
zis.close();
fis.close();
}catch(IOException ex){
ex.printStackTrace();
}
}

我很想告诉你你的代码到底出了什么问题,但是FileOutputStream fos = new FileOutputStream(folder);抛出了一个异常,因为,好吧,folder是一个目录,所以你不能写。

我也不明白你期望new File(folder.getParent()).mkdirs();做什么。

我基本上扔掉了你的代码,重新开始…

public void unZipFolder(File zipFile, File outputFolder) throws IOException {
byte[] buffer = new byte[1024];
System.out.println("ZipFileLocation: " + zipFile);
System.out.println("outputFolder = " + outputFolder);
if (!outputFolder.exists() && !outputFolder.mkdirs()) {
throw new IOException("Unable to create output folder: " + outputFolder);
} else if (outputFolder.exists() && !outputFolder.isDirectory()) {
throw new IOException("Output is not a directory: " + outputFolder);
}
try (ZipFile zipper = new ZipFile(zipFile)) {
Enumeration<? extends ZipEntry> entries = zipper.entries();
while (entries.hasMoreElements()) {
ZipEntry ze = entries.nextElement();
File destination = new File(outputFolder, ze.getName());
if (ze.isDirectory()) {
if (!destination.exists() && !destination.mkdirs()) {
throw new IOException("Could not create directory: " + destination);
}
} else {
System.out.println("Writing " + destination);
try (InputStream is = zipper.getInputStream(ze); FileOutputStream fos = new FileOutputStream(destination)) {
// You could use is.transferTo(fos) here but I'm a grump old coder
byte[] bytes = new byte[1024 * 4];
int bytesRead = -1;
while ((bytesRead = is.read(bytes)) != -1) {
fos.write(bytes, 0, bytesRead);
}
}
}
}
}
}

现在,重要的是要知道,它期望zip文件的目录内容是相对的(即没有根目录信息)。如果您的zip文件确实包含根目录信息(即C:/.../...),那么您将需要自己清理它。

现在,如果你对此有困难,我建议你注释掉"摘录"。部分的代码,并放置在更多的System.out.println语句

transferTo

通读了transferTo的代码后,它基本上和上面的代码示例做的事情是一样的——所以,如果你想减少代码的复杂性(并减少可能的bug风险),你可以使用它——有点老派,我可能仍然会用"老方法"来做。以便为某种形式的进度监控提供支持——但这超出了问题的范围。

<标题>

"安全issues"这个有点难确定,因为没有100%安全的解决方案。

我修改了上面的代码,使用类似于…

Path parent = outputFolder.toPath().toAbsolutePath();
String name = "../" + ze.getName();
Path child = parent.resolveSibling(new File(outputFolder, name).toPath());

这最终会抛出一个NoSuchFileException,所以,至少你可以"快速失败",假设这是你想要的。

您也可以考虑删除..,前/或前路径规范,试图使路径"相对",但这可能变得复杂,因为像somePath/../file这样的东西在您的用例中仍然有效。

相关内容

  • 没有找到相关文章