我编写了一个解压缩 ZIP 存档的程序,然后递归地解压缩或提取其中找到的存档。ZIP 中的档案可能是 tar 或 ZIP 档案,我可以很好地提取它们。
在一些新目录中提取内部档案后,我想删除它们。这适用于 tar 档案,但由于某种原因,它不适用于 ZIP 档案。我已经关闭了所有流,如果删除失败,我会使用 deleteOnExit 作为故障保险,但这也不起作用。
try (ArchiveInputStream ais =
asFactory.createArchiveInputStream(
new BufferedInputStream(
new FileInputStream(archive)))) {
System.out.println("Extracting!");
ArchiveEntry ae;
while ((ae = ais.getNextEntry()) != null) {
if (ae.isDirectory()) {
File dir = new File(archive.getParentFile(), ae.getName());
dir.mkdirs();
continue;
}
File f = new File(archive.getParentFile(), ae.getName());
File parent = f.getParentFile();
parent.mkdirs();
try (OutputStream os = new FileOutputStream(f)) {
IOUtils.copy(ais, os);
os.close();
} catch (IOException innerIoe) {
...
}
}
ais.close();
if (!archive.delete()) {
System.out.printf("Could not remove archive %s%n",
archive.getName());
archive.deleteOnExit();
}
} catch (IOException ioe) {
...
}
应该没有打开的流,除非关闭 ArchiveInputStream 实际上并没有关闭流。但这同样适用于 tar 档案。
我在某处读到有人可以设法删除 ZIP 档案,调用父文件上的 listFiles() 并找到 ZIP 档案并删除它,但这听起来像是一个奇怪的复杂过程。必须有一些更简单的方法。
编辑:
该问题特定于 Windows。在 Linux(SliTaz 4 和 Red Hat Enterprise 5)上,这可以正常工作。这告诉我 Windows 以某种方式锁定了 ZIP 档案,这似乎有点奇怪。