package com.yihu.ehr.util.compress; import com.yihu.ehr.util.operator.StringUtil; import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model.FileHeader; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.util.Zip4jConstants; import java.io.File; import java.util.ArrayList; import java.util.List; /** * 文件压缩辅助类 * * @created Air 2015/5/26. */ public class Zipper { /** * 使用给定密码解压指定的ZIP压缩文件到指定目录 *

* 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出 * * @param zip 指定的ZIP压缩文件 * @param dest 解压目录 * @param passwd ZIP文件的密码 * @return 解压后文件数组 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ public static File[] unzip(String zip, String dest, String passwd) throws ZipException { File zipFile = new File(zip); return unzip(zipFile, dest, passwd); } /** * 使用给定密码解压指定的ZIP压缩文件到当前目录 * * @param zip 指定的ZIP压缩文件 * @param passwd ZIP文件的密码 * @return 解压后文件数组 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ public static File[] unzip(String zip, String passwd) throws ZipException { File zipFile = new File(zip); File parentDir = zipFile.getParentFile(); return unzip(zipFile, parentDir.getAbsolutePath(), passwd); } /** * 使用给定密码解压指定的ZIP压缩文件到指定目录 *

* 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出 * * @param dest 解压目录 * @param passwd ZIP文件的密码 * @return 解压后文件数组 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ public static File[] unzip(File zipFile, String dest, String passwd) throws ZipException { ZipFile zFile = new ZipFile(zipFile); zFile.setFileNameCharset("GBK"); if (!zFile.isValidZipFile()) { throw new ZipException("压缩文件不合法,可能被损坏."); } File destDir = new File(dest); if (destDir.isDirectory() && !destDir.exists()) { destDir.mkdir(); } if (zFile.isEncrypted()) { zFile.setPassword(passwd.toCharArray()); } zFile.extractAll(dest); List headerList = zFile.getFileHeaders(); List extractedFileList = new ArrayList<>(); for (FileHeader fileHeader : headerList) { if (!fileHeader.isDirectory()) { extractedFileList.add(new File(destDir, fileHeader.getFileName())); } } File[] extractedFiles = new File[extractedFileList.size()]; extractedFileList.toArray(extractedFiles); return extractedFiles; } /** * @param unzipFile 需要压缩的文件(文件夹) * @param zipFileName 压缩后的文件名 * @return 成功-File 失败-null * @throws ZipException */ public File zipFile(File unzipFile, String zipFileName) throws ZipException { return zipFile(unzipFile, zipFileName, null); } /** * @param unzipFile 需要压缩的文件(文件夹) * @param zipFileName 压缩后的文件名 * @param pwd 压缩密码 * @return 成功-File 失败-null * @throws ZipException 2015.09.15 airhead modify 压缩文件为文件夹时,压缩从子目录开始,忽略当前目录 */ public File zipFile(File unzipFile, String zipFileName, String pwd) throws ZipException { //文件不存在时不压缩 if (!unzipFile.exists()) { return null; } ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); if (!StringUtil.isEmpty(pwd)) { parameters.setEncryptFiles(true); parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); parameters.setPassword(pwd.toCharArray()); } File file = new File(zipFileName); if (!file.exists()) { file.getParentFile().mkdirs(); } ZipFile zipFile = new ZipFile(zipFileName); if (unzipFile.isDirectory()) { // zipFile.addFolder(unzipFile, parameters); File[] files = unzipFile.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { zipFile.addFolder(files[i], parameters); } else { zipFile.addFile(files[i], parameters); } } } else { zipFile.addFile(unzipFile, parameters); } return new File(zipFileName); } /** * @param zipFile 需要解压的文件名 * @param unzipDirectory 解压文件路径 * @return 成功-File 失败-null * @throws ZipException */ public static File unzipFile(File zipFile, String unzipDirectory) throws ZipException { return unzipFile(zipFile, unzipDirectory, null); } /** * @param zipFile 需要解压的文件名 * @param unzipDirectory 解压文件路径 * @param pwd 解压密码 * @return 成功-File 失败-null * @throws ZipException */ public static File unzipFile(File zipFile, String unzipDirectory, String pwd) throws ZipException { ZipFile zFile = new ZipFile(zipFile); zFile.setFileNameCharset("GBK"); if (!zFile.isValidZipFile()) { throw new ZipException("无效的压缩文件."); } if (zFile.isEncrypted()) { zFile.setPassword(pwd.toCharArray()); } zFile.extractAll(unzipDirectory); return new File(unzipDirectory); } }