package com.whyc.util; import com.github.junrar.Archive; import com.github.junrar.exception.RarException; import com.github.junrar.rarfile.FileHeader; import org.apache.commons.compress.archivers.ArchiveEntry; import org.apache.commons.compress.archivers.ArchiveException; import org.apache.commons.compress.archivers.ArchiveInputStream; import org.apache.commons.compress.archivers.ArchiveStreamFactory; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.LinkedList; import java.util.List; public class FileUtil { public static List getStaticFilePath(File file, List list){ //如果是文件的情况 if (file.isFile()){ list.add(file.getAbsolutePath()); }else{ //如果是目录的情况 //创建一个File数组来存储当前目录下所有文件和目录的绝对路径 File[] files = file.listFiles(); //循环遍历files for (File fileTemp : files){ if(fileTemp.getName().contains(".zip")){ continue; } //子级是目录 if (fileTemp.isDirectory()){ //递归再次进行判断 getStaticFilePath(fileTemp, list); }else{ //子级是文件 String absolutePath = fileTemp.getAbsolutePath(); list.add(absolutePath); //System.out.println(temp + "文件 :" + fileTemp.getName() + "\t"); } } } return list; } public static List getStaticFilePathII(File file, List list){ //如果是文件的情况 if (file.isFile()){ list.add(file.getAbsolutePath()); }else{ //如果是目录的情况 //创建一个File数组来存储当前目录下所有文件和目录的绝对路径 File[] files = file.listFiles(); //循环遍历files for (File fileTemp : files){ //子级是目录 if (fileTemp.isDirectory()){ //递归再次进行判断 getStaticFilePathII(fileTemp, list); }else{ //子级是文件 String absolutePath = fileTemp.getAbsolutePath(); list.add(absolutePath); //System.out.println(temp + "文件 :" + fileTemp.getName() + "\t"); } } } return list; } public static Boolean deleteFile(File file) { //判断文件不为null或文件目录存在 if (file == null || !file.exists()) { System.out.println("文件删除失败,请检查文件是否存在以及文件路径是否正确"); return false; } //获取目录下子文件 File[] files = file.listFiles(); //遍历该目录下的文件对象 for (File f : files) { //判断子目录是否存在子目录,如果是文件则删除 if (f.isDirectory()) { //递归删除目录下的文件 deleteFile(f); } else { //文件删除 f.delete(); //打印文件名 } } //文件夹删除 file.delete(); return true; } public static void download(HttpServletResponse resp,String inFilePath,String outFileFullName){ try { // 转码防止乱码 //resp.addHeader("Content-Disposition", "attachment;filename=" + new String(softwareName.getBytes("UTF-8"), "ISO8859-1")); resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode ( outFileFullName, "utf-8")); OutputStream out = resp.getOutputStream(); FileInputStream in = new FileInputStream(inFilePath); int len=0; byte[] buffer =new byte[1024]; //7. 将缓冲区中的数据输出 while ((len=in.read(buffer))>0){ out.write(buffer,0,len); } in.close(); out.close(); } catch (FileNotFoundException | UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static String saveFile(MultipartFile multipartFile,String fileName) throws IOException { String rootFile = CommonUtil.getRootFile(); String filePath = rootFile + fileName; File file = new File(filePath); File parentFile = file.getParentFile(); if(!parentFile.exists()){ parentFile.mkdirs(); } //存储 multipartFile.transferTo(file); return "doc_file"+fileName; } /** * 复制文件夹内的所有文件到另一个文件夹 */ public static void copyDirectory(File source, File destination) { if (source.isDirectory()) { if (!destination.exists()) { destination.mkdir(); } for (File file : source.listFiles()) { copyDirectory(file, new File(destination, file.getName())); } } else { try (FileInputStream inputStream = new FileInputStream(source); FileOutputStream outputStream = new FileOutputStream(destination)) { byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } } catch (IOException e) { e.printStackTrace(); } } } /** * 解压N层 * @param compressedFileUrl doc_file/xxx/xxx.zip 或者 rar * @return */ public static List decompress(String compressedFileUrl){ List resList = decompressOne(compressedFileUrl); File outputFolderFile = (File) resList.get(0); List fileList = (List) resList.get(1); boolean existCompressedFile = false; int checkDecompress = 0; for(String tempFileName:fileList){ if(tempFileName.endsWith("zip") || tempFileName.endsWith("rar")){ decompressOne(tempFileName); File file = new File(tempFileName); boolean b = file.canExecute(); System.out.println(b); file.delete(); existCompressedFile = true; } } if(existCompressedFile){ checkDecompress ++; } for (int i = 0; i < checkDecompress; i++) { decompress(compressedFileUrl); } List finalList = new LinkedList<>(); getStaticFilePathII(outputFolderFile,finalList); return finalList; } /** * 解压一层 * @param compressedFileUrl doc_file/xxx/xxx.zip 或者 rar * @return */ public static List decompressOne(String compressedFileUrl){ List resList = new LinkedList<>(); String projectDir = CommonUtil.getProjectDir() + File.separator; String fullFilePath; String separator = File.separator; String outputFolderSuffix; if(compressedFileUrl.startsWith(projectDir)) { // 非第一层解压,已经是全路径 fullFilePath = compressedFileUrl; compressedFileUrl = compressedFileUrl.substring(compressedFileUrl.indexOf("decompress")+11); //outputFolderSuffix = compressedFileUrl.substring(0,compressedFileUrl.lastIndexOf(separator)) + separator + "decompress_" + compressedFileUrl.substring(compressedFileUrl.lastIndexOf(separator)+1); outputFolderSuffix = compressedFileUrl +"_decompress"; }else{ //第一层解压 fullFilePath = projectDir + compressedFileUrl; outputFolderSuffix = compressedFileUrl.replace(separator, "@"); } File file = new File(fullFilePath); String outputFolder = CommonUtil.getRootFile() + separator + "decompress" + separator + outputFolderSuffix; File outputFolderFile = new File(outputFolder); if(!outputFolderFile.exists()){ outputFolderFile.mkdirs(); if(compressedFileUrl.endsWith("zip")){ decompressZip(file, outputFolder); }else { //rar decompressRar(file, outputFolder); } } //返回文件夹所有文件 LinkedList list = new LinkedList<>(); getStaticFilePathII(outputFolderFile,list); resList.add(outputFolderFile); resList.add(list); return resList; } public static String decompressT(File file){ String fileName = file.getName(); String outputFolder = "C:\\Users\\29550\\Desktop\\decompress" + File.separator + fileName; File outputFolderFile = new File(outputFolder); if(!outputFolderFile.exists()){ outputFolderFile.mkdirs(); } if(fileName.endsWith("zip")){ decompressZip(file, outputFolder); }else { //rar decompressRar(file, outputFolder); } return null; } private static void decompressZip(File file, String outputFolder) { try (ArchiveInputStream ais = new ArchiveStreamFactory().createArchiveInputStream("zip", new FileInputStream(file))) { ArchiveEntry entry; while ((entry = ais.getNextEntry()) != null) { if (!ais.canReadEntryData(entry) || entry.isDirectory()) { continue; } byte[] buffer = new byte[4096]; int bytesRead; String entryName = entry.getName(); //if(entryName.contains(File.separator)){ if(entryName.contains("/")){ String entryNameDir = entryName.substring(0, entryName.lastIndexOf("/")); String entryDirStr = outputFolder + File.separator + entryNameDir; File entryDir = new File(entryDirStr); if(!entryDir.exists()){ entryDir.mkdirs(); } } OutputStream outputStream = new FileOutputStream(new File(outputFolder + File.separator + entryName)); while ((bytesRead = ais.read(buffer)) > -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); } } catch (IOException | ArchiveException e) { e.printStackTrace(); } } private static void decompressRar(File file, String outputFolder) { try { Archive archive = new Archive(file); FileHeader fileHeader = archive.nextFileHeader(); if (fileHeader != null) { while (fileHeader != null) { if (fileHeader.isDirectory()) { fileHeader = archive.nextFileHeader(); continue; } String tempFilePath = fileHeader.getFileName(); File out = new File(outputFolder + File.separator + tempFilePath); if (!out.exists()) { if (!out.getParentFile().exists()) { out.getParentFile().mkdirs(); } out.createNewFile(); } FileOutputStream os = new FileOutputStream(out); archive.extractFile(fileHeader, os); os.close(); fileHeader = archive.nextFileHeader(); } } archive.close(); } catch (IOException | RarException e) { e.printStackTrace(); } } public static void main(String[] args) { //File file = new File("C:\\Users\\29550\\Desktop\\AppScan10.rar"); File file = new File("C:\\code\\web\\CadDrawManager\\target\\doc_file\\decompress\\doc_file@product@FBS-9600-GDPDX-XS1-DC220V-JH@standard@3@3++.rar"); if(file.exists()) { boolean delete = file.delete(); System.out.println(delete); } } }