From e394b23be81dfa3f14364a060acba432cd61f8a8 Mon Sep 17 00:00:00 2001 From: mjkhan21 Date: Fri, 14 Jul 2023 17:58:21 +0900 Subject: [PATCH] =?UTF-8?q?*.zip=20=ED=8C=8C=EC=9D=BC=20=EC=9C=A0=ED=8B=B8?= =?UTF-8?q?=EB=A6=AC=ED=8B=B0=20ZIP=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cokr/xit/base/file/ZIP.java | 54 ++++++++++++++++++----- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/src/main/java/cokr/xit/base/file/ZIP.java b/src/main/java/cokr/xit/base/file/ZIP.java index d820a57..98ca52c 100644 --- a/src/main/java/cokr/xit/base/file/ZIP.java +++ b/src/main/java/cokr/xit/base/file/ZIP.java @@ -11,18 +11,34 @@ import java.util.zip.ZipOutputStream; import cokr.xit.foundation.Assert; +/**파일 압축/압축 해제 유틸리티 + *

파일을 *.zip 파일로 압축하거나, *.zip 파일의 압축을 해제한다. + * @author mjkhan + */ public class ZIP { + /**지정한 파일들을 지정한 경로의 zip 파일로 압축한다. + * @param zipPath zip 파일 경로 + * @param targets 압축할 파일들의 경로 + * @return 압축한 zip 파일 + */ public File compress(String zipPath, String... targets) { return compress(zipPath, Arrays.asList(targets)); } + /**지정한 파일들을 지정한 경로의 zip 파일로 압축한다. + * @param zipPath zip 파일 경로 + * @param targets 압축할 파일들의 경로 + * @return 압축한 zip 파일 + */ public File compress(String zipPath, List targets) { try ( FileOutputStream fout = new FileOutputStream(zipPath); ZipOutputStream zout = new ZipOutputStream(fout); ) { - for (String path: targets) - compress(zout, path); + for (String path: targets) { + File file = new File(path); + compress(zout, file, file.getName()); + } return new File(zipPath); } catch(Exception e) { @@ -30,18 +46,32 @@ public class ZIP { } } - private void compress(ZipOutputStream zout, String path) throws Exception { - File file = new File(path); - try (FileInputStream fis = new FileInputStream(file);) { - zout.putNextEntry(new ZipEntry(file.getName())); - byte[] bytes = new byte[1024]; - int length; - while((length = fis.read(bytes)) >= 0) { - zout.write(bytes, 0, length); - } - } + private void compress(ZipOutputStream zout, File file, String filename) throws Exception { + if (file.isHidden()) return; + + if (file.isDirectory()) { + zout.putNextEntry(new ZipEntry(filename.endsWith("/") ? filename : filename + "/")); + zout.closeEntry(); + + File[] children = file.listFiles(); + for (File child: children) { + compress(zout, child, filename + "/" + child.getName()); + } + } else + try (FileInputStream fis = new FileInputStream(file);) { + zout.putNextEntry(new ZipEntry(filename)); + byte[] bytes = new byte[1024]; + int length; + while((length = fis.read(bytes)) >= 0) { + zout.write(bytes, 0, length); + } + } } + /**지정한 zip 파일을 지정한 경로의 디렉토리에 압축을 해제한다. + * @param zipPath zip 파일 경로 + * @param destDir 압축을 해제한 파일들을 저장할 디렉토리 경로 + */ public void decompress(String zipPath, String destDir) { try ( FileInputStream fis = new FileInputStream(zipPath);