From 66db1d15cf5d4b51a346a42b66f0505bd7f31ce0 Mon Sep 17 00:00:00 2001
From: whycxzp <glperry@163.com>
Date: 星期三, 03 一月 2024 15:23:47 +0800
Subject: [PATCH] 解压

---
 src/main/java/com/whyc/util/FileUtil.java |  175 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 170 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/whyc/util/FileUtil.java b/src/main/java/com/whyc/util/FileUtil.java
index e22eb6e..ba1fcde 100644
--- a/src/main/java/com/whyc/util/FileUtil.java
+++ b/src/main/java/com/whyc/util/FileUtil.java
@@ -1,11 +1,18 @@
 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.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 
 public class FileUtil {
@@ -28,6 +35,32 @@
                 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<String> getStaticFilePathII(File file, List<String> list){
+
+        //濡傛灉鏄枃浠剁殑鎯呭喌
+        if (file.isFile()){
+            list.add(file.getAbsolutePath());
+        }else{
+            //濡傛灉鏄洰褰曠殑鎯呭喌
+            //鍒涘缓涓�涓狥ile鏁扮粍鏉ュ瓨鍌ㄥ綋鍓嶇洰褰曚笅鎵�鏈夋枃浠跺拰鐩綍鐨勭粷瀵硅矾寰�
+            File[] files = file.listFiles();
+            //寰幆閬嶅巻files
+            for (File fileTemp : files){
+                //瀛愮骇鏄洰褰�
+                if (fileTemp.isDirectory()){
+                    //閫掑綊鍐嶆杩涜鍒ゆ柇
+                    getStaticFilePathII(fileTemp, list);
                 }else{
                     //瀛愮骇鏄枃浠�
                     String absolutePath = fileTemp.getAbsolutePath();
@@ -126,10 +159,142 @@
         }
     }
 
+    /**
+     * 瑙e帇N灞�
+     * @param compressedFileUrl doc_file/xxx/xxx.zip 鎴栬�� rar
+     * @return
+     */
+    public static List<String> decompress(String compressedFileUrl) throws ArchiveException, IOException, RarException {
+        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);
+                file.delete();
+                existCompressedFile = true;
+            }
+        }
+        if(existCompressedFile){
+            checkDecompress ++;
+        }
+        for (int i = 0; i < checkDecompress; i++) {
+            decompress(compressedFileUrl);
+        }
+
+        List<String> finalList = new LinkedList<>();
+        getStaticFilePathII(outputFolderFile,finalList);
+        return finalList;
+    }
+
+    /**
+     * 瑙e帇涓�灞�
+     * @param compressedFileUrl doc_file/xxx/xxx.zip 鎴栬�� rar
+     * @return
+     */
+    public static List<Object> decompressOne(String compressedFileUrl) throws IOException, ArchiveException, RarException {
+        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().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();
+        }
+
+    }
+
+    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);
+        }
     }
 }

--
Gitblit v1.9.1