From a3793f106c0f3f413189433334ef98a9ac38e362 Mon Sep 17 00:00:00 2001 From: godotg Date: Tue, 14 May 2024 16:01:48 +0800 Subject: [PATCH] feat[zip]: zip directory --- .../com/zfoo/net/util/security/ZipUtils.java | 38 +++++++++++++++---- .../com/zfoo/net/util/security/ZipTest.java | 6 +-- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/net/src/main/java/com/zfoo/net/util/security/ZipUtils.java b/net/src/main/java/com/zfoo/net/util/security/ZipUtils.java index bf443e6f..f38f9f90 100644 --- a/net/src/main/java/com/zfoo/net/util/security/ZipUtils.java +++ b/net/src/main/java/com/zfoo/net/util/security/ZipUtils.java @@ -12,11 +12,14 @@ package com.zfoo.net.util.security; +import com.zfoo.protocol.collection.CollectionUtils; import com.zfoo.protocol.util.FileUtils; import com.zfoo.protocol.util.IOUtils; +import com.zfoo.protocol.util.StringUtils; import java.io.*; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.zip.*; /** @@ -69,6 +72,9 @@ public abstract class ZipUtils { // ----------------------------------------------------------------------------------------------------------------- + /** + * default charset is UTF-8 + */ public static void zip(String[] sourceFilePaths, String zipFilePath) { FileOutputStream fos = null; ZipOutputStream zipOut = null; @@ -76,15 +82,28 @@ public abstract class ZipUtils { fos = new FileOutputStream(zipFilePath); zipOut = new ZipOutputStream(fos); for (var sourceFilePath : sourceFilePaths) { - var fileToZip = new File(sourceFilePath); - if (fileToZip.isHidden()) { - continue; + var file = new File(sourceFilePath); + if (file.isDirectory()) { + var files = FileUtils.getAllReadableFiles(file); + for (var f : files) { + if (f.isHidden()) { + continue; + } + var fis = new FileInputStream(f); + var subPath = StringUtils.substringAfterFirst(f.getAbsolutePath(), file.getParentFile().getAbsolutePath()); + subPath = StringUtils.substringAfterFirst(subPath, file.getName()); + ZipEntry zipEntry = new ZipEntry(file.getName() + subPath); + zipOut.putNextEntry(zipEntry); + IOUtils.copy(fis, zipOut); + IOUtils.closeIO(fis); + } + } else { + var fis = new FileInputStream(file); + ZipEntry zipEntry = new ZipEntry(file.getName()); + zipOut.putNextEntry(zipEntry); + IOUtils.copy(fis, zipOut); + IOUtils.closeIO(fis); } - var fis = new FileInputStream(fileToZip); - ZipEntry zipEntry = new ZipEntry(fileToZip.getName()); - zipOut.putNextEntry(zipEntry); - IOUtils.copy(fis, zipOut); - IOUtils.closeIO(fis); } } catch (Exception e) { throw new RuntimeException(e); @@ -94,6 +113,9 @@ public abstract class ZipUtils { } + /** + * default charset is UTF-8 + */ public static void unzip(String zipFilePath, String destDirectory) { try { unzip(FileUtils.openInputStream(new File(zipFilePath)), destDirectory); diff --git a/net/src/test/java/com/zfoo/net/util/security/ZipTest.java b/net/src/test/java/com/zfoo/net/util/security/ZipTest.java index 9db7838f..9e21864e 100644 --- a/net/src/test/java/com/zfoo/net/util/security/ZipTest.java +++ b/net/src/test/java/com/zfoo/net/util/security/ZipTest.java @@ -15,8 +15,6 @@ package com.zfoo.net.util.security; import org.junit.Assert; import org.junit.Test; -import java.io.IOException; - /** * @author godotg */ @@ -48,8 +46,8 @@ public class ZipTest { @Test public void zipTest() { - var sourceFiles = new String[]{"./README.md","./README_CN.md"}; - ZipUtils.zip(sourceFiles, "./ai-simulator.zip"); + var sourceFiles = new String[]{"./src","./README.md"}; + ZipUtils.zip(sourceFiles, "./my-source.zip"); } @Test