From d6ac2ef4bc6672a77efddbd2fc72cffacaeab7a7 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 27 Jun 2022 21:26:16 +0800 Subject: [PATCH] fix bug --- .../hutool/core/compress/ZipCopyVisitor.java | 10 +++++++--- .../hutool/core/compress/IssueI5DRU0Test.java | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 hutool-core/src/test/java/cn/hutool/core/compress/IssueI5DRU0Test.java diff --git a/hutool-core/src/main/java/cn/hutool/core/compress/ZipCopyVisitor.java b/hutool-core/src/main/java/cn/hutool/core/compress/ZipCopyVisitor.java index 984fed05c..be67665d4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/compress/ZipCopyVisitor.java +++ b/hutool-core/src/main/java/cn/hutool/core/compress/ZipCopyVisitor.java @@ -4,6 +4,7 @@ import cn.hutool.core.text.StrUtil; import java.io.IOException; import java.nio.file.CopyOption; +import java.nio.file.DirectoryNotEmptyException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.FileSystem; import java.nio.file.FileVisitResult; @@ -31,8 +32,8 @@ public class ZipCopyVisitor extends SimpleFileVisitor { /** * 构造 * - * @param source 源Path,或基准路径,用于计算被拷贝文件的相对路径 - * @param fileSystem 目标Zip文件 + * @param source 源Path,或基准路径,用于计算被拷贝文件的相对路径 + * @param fileSystem 目标Zip文件 * @param copyOptions 拷贝选项,如跳过已存在等 */ public ZipCopyVisitor(final Path source, final FileSystem fileSystem, final CopyOption... copyOptions) { @@ -44,14 +45,17 @@ public class ZipCopyVisitor extends SimpleFileVisitor { @Override public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attrs) throws IOException { final Path targetDir = resolveTarget(dir); - if(StrUtil.isNotEmpty(targetDir.toString())){ + if (StrUtil.isNotEmpty(targetDir.toString())) { // 在目标的Zip文件中的相对位置创建目录 try { Files.copy(dir, targetDir, copyOptions); + } catch (final DirectoryNotEmptyException ignore) { + // 目录已经存在,则跳过 } catch (final FileAlreadyExistsException e) { if (false == Files.isDirectory(targetDir)) { throw e; } + // 目录非空情况下,跳过创建目录 } } diff --git a/hutool-core/src/test/java/cn/hutool/core/compress/IssueI5DRU0Test.java b/hutool-core/src/test/java/cn/hutool/core/compress/IssueI5DRU0Test.java new file mode 100644 index 000000000..9d3a79340 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/compress/IssueI5DRU0Test.java @@ -0,0 +1,18 @@ +package cn.hutool.core.compress; + +import org.junit.Ignore; +import org.junit.Test; + +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; + +public class IssueI5DRU0Test { + + @Test + @Ignore + public void appendTest(){ + // https://gitee.com/dromara/hutool/issues/I5DRU0 + // 向zip中添加文件的时候,如果添加的文件的父目录已经存在,会报错。实际中目录存在忽略即可。 + ZipUtil.append(Paths.get("d:/test/zipTest.zip"), Paths.get("d:/test/zipTest"), StandardCopyOption.REPLACE_EXISTING); + } +}