|
|
|
@ -11,18 +11,34 @@ import java.util.zip.ZipOutputStream;
|
|
|
|
|
|
|
|
|
|
import cokr.xit.foundation.Assert;
|
|
|
|
|
|
|
|
|
|
/**파일 압축/압축 해제 유틸리티
|
|
|
|
|
* <p>파일을 *.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<String> 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,10 +46,20 @@ public class ZIP {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void compress(ZipOutputStream zout, String path) throws Exception {
|
|
|
|
|
File file = new File(path);
|
|
|
|
|
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(file.getName()));
|
|
|
|
|
zout.putNextEntry(new ZipEntry(filename));
|
|
|
|
|
byte[] bytes = new byte[1024];
|
|
|
|
|
int length;
|
|
|
|
|
while((length = fis.read(bytes)) >= 0) {
|
|
|
|
@ -42,6 +68,10 @@ public class ZIP {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**지정한 zip 파일을 지정한 경로의 디렉토리에 압축을 해제한다.
|
|
|
|
|
* @param zipPath zip 파일 경로
|
|
|
|
|
* @param destDir 압축을 해제한 파일들을 저장할 디렉토리 경로
|
|
|
|
|
*/
|
|
|
|
|
public void decompress(String zipPath, String destDir) {
|
|
|
|
|
try (
|
|
|
|
|
FileInputStream fis = new FileInputStream(zipPath);
|
|
|
|
|