| | |
| | | package com.whyc.util; |
| | | |
| | | 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.nio.file.Files; |
| | | import java.util.ArrayList; |
| | | import java.util.LinkedList; |
| | | import java.util.List; |
| | | |
| | | public class FileUtil { |
| | | |
| | | |
| | | public static List<String> getStaticFilePath(File file, List<String> list){ |
| | | |
| | |
| | | return list; |
| | | } |
| | | |
| | | public static List<String> getStaticFilePathII(File file, List<String> 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(); |
| | | //打印文件名 |
| | | if(file.isDirectory()){ |
| | | //获取目录下子文件 |
| | | File[] files = file.listFiles(); |
| | | //遍历该目录下的文件对象 |
| | | for (File f : files) { |
| | | //判断子目录是否存在子目录,如果是文件则删除 |
| | | if (f.isDirectory()) { |
| | | //递归删除目录下的文件 |
| | | deleteFile(f); |
| | | } else { |
| | | //文件删除 |
| | | f.delete(); |
| | | //打印文件名 |
| | | } |
| | | } |
| | | //文件夹删除 |
| | | file.delete(); |
| | | }else{ |
| | | file.delete(); |
| | | } |
| | | //文件夹删除 |
| | | file.delete(); |
| | | return true; |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | 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<String> decompress(String compressedFileUrl) throws ArchiveException, IOException, InterruptedException { |
| | | List<Object> resList = decompressOne(compressedFileUrl); |
| | | File outputFolderFile = (File) resList.get(0); |
| | | List<String> fileList = (List<String>) 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 delete = file.delete(); |
| | | Files.delete(file.toPath()); |
| | | existCompressedFile = true; |
| | | } |
| | | } |
| | | //如果存在压缩文件并已解压,则需要检查一次是否还有压缩文件 |
| | | if(existCompressedFile){ |
| | | checkDecompress ++; |
| | | } |
| | | for (int i = 0; i < checkDecompress; i++) { |
| | | decompress(compressedFileUrl); |
| | | } |
| | | |
| | | List<String> finalList = new LinkedList<>(); |
| | | getStaticFilePathII(outputFolderFile,finalList); |
| | | return finalList; |
| | | } |
| | | |
| | | /** |
| | | * 解压一层 |
| | | * @param compressedFileUrl doc_file/xxx/xxx.zip 或者 rar |
| | | * @return |
| | | */ |
| | | public static List<Object> decompressOne(String compressedFileUrl) throws IOException, ArchiveException, InterruptedException { |
| | | List<Object> 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<String> list = new LinkedList<>(); |
| | | getStaticFilePathII(outputFolderFile,list); |
| | | resList.add(outputFolderFile); |
| | | resList.add(list); |
| | | return resList; |
| | | } |
| | | |
| | | private static void decompressZip(File file, String outputFolder) throws IOException, ArchiveException { |
| | | ArchiveInputStream ais = new ArchiveStreamFactory("GBK").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(); |
| | | } |
| | | //关流 |
| | | ais.close(); |
| | | |
| | | } |
| | | private static void decompressRar(File file, String outputFolder) throws IOException, InterruptedException { |
| | | String winrarPath = "C:\\Program Files\\WinRAR\\WinRAR.exe"; |
| | | String cmd = winrarPath + " X " + file + " " + outputFolder; |
| | | Process proc = Runtime.getRuntime().exec(cmd); |
| | | proc.waitFor(); |
| | | } |
| | | |
| | | //读取文件夹下的所有文件(不读取文件夹内的文件) |
| | | public static List getFileNameWithOutDirectory(String filePath) { |
| | | File folder = new File(filePath); // 文件夹路径 |
| | | List nameList=new ArrayList(); |
| | | File[] listOfFiles = folder.listFiles(); |
| | | if (listOfFiles != null) { |
| | | for (File file : listOfFiles) { |
| | | if (file.isFile()) { |
| | | nameList.add(file.getName()); |
| | | } |
| | | } |
| | | } |
| | | return nameList; |
| | | } |
| | | |
| | | //private static void decompressRar(File file, String outputFolder) throws IOException, RarException { |
| | | // 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(); |
| | | // |
| | | //} |
| | | |
| | | public static void main(String[] args) { |
| | | File file = new File("C:\\Users\\29550\\Desktop\\当前项目\\202207泰州平台"); |
| | | List list = new ArrayList<>(); |
| | | list = getStaticFilePath( file,list); |
| | | System.out.println(list); |
| | | //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); |
| | | } |
| | | } |
| | | } |