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);