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){
|
|
//如果是文件的情况
|
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<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();
|
//打印文件名
|
}
|
}
|
//文件夹删除
|
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 "pis_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\\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);
|
}
|
}
|
}
|