package hcit.user.hcit.modules.cpgl.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import de.innosystec.unrar.Archive;
import de.innosystec.unrar.rarfile.FileHeader;
/**
- 解压Zip和Rar压缩文件
- @author sjd
-
2018-8-22 下午8:10:19
*/
public class UnZipRarFile
{
public static final long serialVersionUID = 201808231401L;
/**
* * 解压文件到指定目录 * 解压后的文件名,和之前一致 *
*
* @param P_ZipFile
* 待解压的zip文件 *
* @param P_DescDir
* 指定目录
*/
@SuppressWarnings("unchecked")
public static void unZipFiles(File P_ZipFile, String P_DescDir) throws IOException
{
ZipFile zip = new ZipFile(P_ZipFile, "GBK");// 解决中文文件夹乱码
String strFileName = "";// zip.getName().substring(zip.getName().lastIndexOf('\\') + 1, zip.getName().lastIndexOf('.'));
File pathFile = new File(P_DescDir + strFileName);
if (!pathFile.exists())
{
pathFile.mkdirs();
}
for (Enumeration<? extends ZipEntry> entries = zip.getEntries(); entries.hasMoreElements();)
{
ZipEntry entry = (ZipEntry) entries.nextElement();
String zipEntryName = entry.getName();
InputStream in = zip.getInputStream(entry);
String strOutPath = (P_DescDir + strFileName + "/" + zipEntryName).replaceAll("\\*", "/");//文件输出路径
// 判断路径是否存在,不存在则创建文件路径
File file = new File(strOutPath.substring(0, strOutPath.lastIndexOf('/')));
if (!file.exists())
{
file.mkdirs();
}
// 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
if (new File(strOutPath).isDirectory())
{
continue;
}
FileOutputStream out = new FileOutputStream(strOutPath);
byte[] buf1 = new byte[1024];
int len;
while ((len = in.read(buf1)) > 0)
{
out.write(buf1, 0, len);
}
in.close();
out.close();
}
}
/**
* * 根据原始rar路径,解压到指定文件夹下.
*
* @param P_SrcRarPath
* 原始rar路径
* @param P_DstDirectoryPath
* 解压到的文件夹
*/
public static void unRarFile(String P_SrcRarPath, String P_DstDirectoryPath)
{
if (P_SrcRarPath.toLowerCase().endsWith(".rar") == true)
{
File dstDiretory = new File(P_DstDirectoryPath);
if (!dstDiretory.exists())// 目标目录不存在时,创建该文件夹
{
dstDiretory.mkdirs();
}
try
{
Archive archive = new Archive(new File(P_SrcRarPath));
if (archive != null)
{
FileHeader fh = archive.nextFileHeader();
while (fh != null)
{
// 防止文件名中文乱码问题的处理
String fileName = fh.getFileNameW().isEmpty() ? fh.getFileNameString() : fh.getFileNameW();
if (fh.isDirectory())// 文件夹
{
File fol = new File(P_DstDirectoryPath + File.separator + fileName);
fol.mkdirs();
}
else
{
File out = new File(P_DstDirectoryPath + File.separator + fileName.trim());
try
{
if (!out.exists())
{
if (!out.getParentFile().exists())// 相对路径可能多级
{
out.getParentFile().mkdirs();
}
out.createNewFile();
}
FileOutputStream os = new FileOutputStream(out);
archive.extractFile(fh, os);
os.close();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
fh = archive.nextFileHeader();
}
archive.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}