package com.adc.da.common; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipFile; import org.apache.commons.lang3.StringUtils; import org.apache.poi.util.StringUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; public class FileUnZip { private static final Logger logger = LoggerFactory.getLogger(FileUnZip.class); /** * 解压zip文件 * * @param sourceFile,待解压的zip文件; toFolder,解压后的存放路径 * @throws Exception * @author gaoyan **/ public static String unZipFiles(String sourceFile, String descDir) throws IOException { File zipFile = new File(sourceFile); File pathFile = new File(descDir); if (!pathFile.exists()) { pathFile.mkdirs(); } ZipFile zip = new ZipFile(zipFile,"gbk"); String orgMkdirs = ""; for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) { ZipArchiveEntry entry = (ZipArchiveEntry) entries.nextElement(); String zipEntryName = entry.getName(); String outPath = (descDir + "/" + zipEntryName).replaceAll("\\*", "/"); //判断路径是否存在,不存在则创建文件路径 File file = new File(outPath.substring(0, outPath.lastIndexOf('/'))); if (!file.exists()) { orgMkdirs = outPath.substring(0, outPath.lastIndexOf('/')); file.mkdirs(); }else{ orgMkdirs = outPath.substring(0, outPath.lastIndexOf('/')); } //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压 if (new File(outPath).isDirectory()) { continue; } //输出文件路径信息 // InputStream in = null; // OutputStream out = null; System.gc(); try(InputStream in =zip.getInputStream(entry); OutputStream out =new FileOutputStream(outPath) ){ byte[] buf1 = new byte[1024]; int len; while ((len = in.read(buf1)) > 0) { out.write(buf1, 0, len); } }catch(IOException e){ logger.error(e.getMessage(),e); } } System.gc(); zip.close(); return orgMkdirs; } /** * 递归删除文件及文件夹 * * @throws Exception * @author gaoyan * toFolder,解压后的存放路径 **/ public static boolean deleteDir(File dir) { if (dir.isDirectory()) { String[] children = dir.list(); for (int i = 0; i < children.length; i++) { File files = new File(dir, children[i]); boolean success = deleteDir(files); if (!success) { return false; } } } // 目录此时为空,可以删除 return dir.delete(); } /** * 读取一个目录下所有的Excel文件 * gaoyan * * @param path */ public static List readExcelFile(String path) { File file = new File(path); List resultlist = new ArrayList<>(); if (file.isDirectory()) { File[] files = file.listFiles(); for (File fi : files) { // 对文件进行过滤,只读取Excel文件 if (fi.getName().contains(".xls") || fi.getName().contains(".xlsx")) { resultlist.add(fi); } } } return resultlist; } public static List readImpExcelFile(String path) { File file = new File(path); List resultlist = new ArrayList<>(); if (file.isDirectory()) { File[] files = file.listFiles(); for (File fi : files) { // 对文件进行过滤,只读取Excel文件 String name = fi.getName(); // "导入模板".equals(fi.getName()) || "导入模板.xlsx".equals(fi.getName()) if (name != null &&( fi.getName().contains(".xls") || fi.getName().contains(".xlsx") )){ resultlist.add(fi); } } } return resultlist; } /** * 根据文件名称读取固定目录下文件 * gaoyan * @param filename */ public static List readFileByFilename(String path,String filename) { List resultlist = new ArrayList<>(); if (StringUtils.isNotEmpty(path)){ File file = new File(path); if (file.isDirectory()) { File[] files = file.listFiles(); for (File fi : files) { // 对文件进行过滤 if (fi.getName().equals(filename)) { resultlist.add(fi); } } } } return resultlist; } /** *@Description: 删除某个文件 *@Param: [file] *@return: void *@Author: duyunbao *@date: 2019/5/23 20:31 */ public static void delete(File file) { if (!file.exists()) return; if (file.isFile() || file.list() == null) { file.delete(); logger.info("删除了" + file.getName()); } else { File[] files = file.listFiles(); for (File a : files) { delete(a); } file.delete(); logger.info("删除了" + file.getName()); } } }