java獲取檔案目錄樹,建立資料夾、刪除資料夾
阿新 • • 發佈:2020-12-09
技術標籤:java
目錄
1.FileInfo實體類
package cn.piesat.document.domain; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; import java.util.List; @Data @NoArgsConstructor @AllArgsConstructor @Builder public class FileInfo { /** * 資料夾或檔名 */ private String fileName; /** * 相對路徑 */ private String filePath; /** * 絕對路徑 */ private String absolutePath; /** * 檔案大小 */ private Long fileSize; /** * 更新時間 */ private Date updateTime; /** * 檔案中子檔案 */ private List<FileInfo> childrenFileList; /** * 檔案型別 1其他檔案 2-模板檔案 判斷選擇不同的根路徑 */ private Integer fileType; }
2.service介面
/** * 獲取檔案目錄樹 * * @param fileInfo 檔案資訊 * @param isFile 是否獲得檔案 * @param isChildren 是否獲得子集 * @return 檔案目錄樹 * @throws FileNotFoundException */ List<FileInfo> getFileDirectoryTree(FileInfo fileInfo, Boolean isFile, Boolean isChildren) throws FileNotFoundException; /** * 新建資料夾 * * @param fileInfo 檔案資訊 * @return 新建成功返回true否則false */ boolean newFolder(FileInfo fileInfo); /** * 刪除檔案 * * @param fileInfo 檔案資訊 * @return 刪除成功返回true否則false */ boolean delFile(FileInfo fileInfo);
3. impl實現
/** * 獲取文件目錄樹 * * @param fileInfo 檔案資訊 * @param isFile 是否獲得檔案 * @param isChildren 是否獲得子集 * @return * @throws FileNotFoundException */ @Override public List<FileInfo> getFileDirectoryTree(FileInfo fileInfo, Boolean isFile, Boolean isChildren) throws FileNotFoundException { List<FileInfo> tree = new ArrayList<>(); //獲取根路徑配置 String rootDirectory = getRootDirectory(fileInfo.getFileType()); File file = new File(rootDirectory + fileInfo.getFilePath()); if (!file.exists()) { throw new FileNotFoundException("檔案不存在"); } if (file.isFile()) { tree.add(getFileInfo(file, fileInfo)); } else { File[] files = file.listFiles(); for (File f : files) { if (f.isDirectory()) { //獲取檔案物件 FileInfo info = getFolder(f, fileInfo); //是否獲取子檔案列表 if (isChildren) { List<FileInfo> list = getFileDirectoryTree(FileInfo.builder() .filePath(fileInfo.getFilePath() + "/" + f.getName()) .fileType(fileInfo.getFileType()) .build(), isFile, isChildren); info.setChildrenFileList(list); } tree.add(info); } else { //是否獲取檔案 if (isFile) { tree.add(getFileInfo(f, fileInfo)); } } } } return tree; } //設定檔案屬性列表 private FileInfo getFileInfo(File f, FileInfo fileInfo) { FileInfo info = getFolder(f, fileInfo); info.setFileSize(f.length()); info.setUpdateTime(new Date(f.lastModified())); info.setChildrenFileList(new ArrayList<>()); return info; } //獲取檔案絕對路徑 private FileInfo getFolder(File f, FileInfo fileInfo) { FileInfo info = new FileInfo(); info.setFileName(f.getName()); info.setFilePath(IoUtil.convertLinuxPath(fileInfo.getFilePath() + "/" + f.getName())); info.setAbsolutePath(IoUtil.convertLinuxPath(f.getAbsolutePath())); info.setFileType(fileInfo.getFileType()); return info; } //獲取檔案根路徑 private String getRootDirectory(Integer fileType) { String rootDirectory = ""; switch (fileType) { case FileTypeConstant.FILE_OTHER: rootDirectory = DocManagerConfig.getUploadPath(); break; case FileTypeConstant.FILE_TEMPLATE: rootDirectory = DocManagerConfig.getAvatarPath(); break; default: throw new RuntimeException("非法檔案型別"); } return rootDirectory; } @Override public boolean newFolder(FileInfo fileInfo) { if (fileInfo.getFileType() == FileTypeConstant.ONLINE || fileInfo.getFileType() == FileTypeConstant.FZ) { return false; } String rootDirectory = getRootDirectory(fileInfo.getFileType()); File file = new File(rootDirectory + fileInfo.getFilePath() + File.separator + fileInfo.getFileName()); File faFile = new File(rootDirectory + fileInfo.getFilePath()); if (!faFile.exists()) { boolean result = faFile.mkdirs(); } if (!faFile.isDirectory()) { throw new IllegalArgumentException("該檔案不是目錄"); } if (file.exists()) { throw new IllegalArgumentException("該目錄已存在"); } else { boolean flag = file.mkdir(); return flag; } } @Override public boolean delFile(FileInfo fileInfo) { if (fileInfo.getFileType() == FileTypeConstant.ONLINE || fileInfo.getFileType() == FileTypeConstant.FZ) { return false; } String rootDirectory = getRootDirectory(fileInfo.getFileType()); File file = new File(rootDirectory + fileInfo.getFilePath()); if (!file.exists()) { throw new IllegalArgumentException("不存在該檔案"); } boolean result = true; if (file.isDirectory()) { try { FileUtils.deleteDirectory(file); } catch (IOException e) { result = false; } } else { result = file.delete(); } return result; }
4.Controller實現
/**
* 返回服務端檔案目錄結構
*/
@GetMapping("/tree")
public TableDataInfo findFileDirectoryTree(FileInfo fileInfo) {
List<FileInfo> list = null;
try {
list = fileBaseInfoService.getFileDirectoryTree(fileInfo, true, false);
} catch (FileNotFoundException e) {
e.printStackTrace();
return getDataTable(null);
}
//統一返回資料方式
return getDataTable(list);
}
/**
* 新建資料夾
*/
@RequestMapping(value = "newFolder", method = RequestMethod.POST)
@ApiOperation(value = "新建資料夾")
public Response newFolder(FileInfo fileInfo) {
boolean result = service.newFolder(fileInfo);
if (result) {
return Response.getInstance().setOk(200, "", "建立成功", null);
} else {
return Response.getInstance().setError(400, "", "建立失敗");
}
}
/**
* 刪除檔案或資料夾
*/
@RequestMapping(value = "delFile", method = RequestMethod.POST)
@ApiOperation(value = "刪除檔案或資料夾")
public Response delFile(FileInfo fileInfo) {
boolean result = service.delFile(fileInfo);
if (result) {
return Response.getResultData(200, "刪除成功");
} else {
return Response.getResultData(400, "刪除失敗");
}
}
5.工具類
package cn.piesat.common.utils.file;
import org.apache.commons.io.IOUtils;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.nio.charset.Charset;
/**
* @date 2018-07-17 15:29
* @description IO操作類
*/
public class IoUtil {
private static final org.slf4j.Logger log = LoggerFactory.getLogger(IoUtil.class);
/**
* 將檔案讀出裝入byte陣列中
*
* @param path
* @return
*/
public static byte[] toByteArray(String path) {
FileInputStream is = null;
try {
File file = new File(path);
if (file != null && file.exists()) {
is = new FileInputStream(file);
return IOUtils.toByteArray(is);
}
return null;
} catch (IOException e) {
log.error("讀取" + path + "檔案成byte陣列失敗", e);
return null;
} finally {
close(is, null);
}
}
/**
* 將輸入流讀出裝入byte陣列中
*
* @param inputStream 輸入流
* @return
*/
public static byte[] toByteArray(InputStream inputStream) {
try {
return IOUtils.toByteArray(inputStream);
} catch (IOException e) {
log.error("讀取輸入流成byte陣列失敗", e);
return null;
}
}
/**
* 將本地檔案讀成輸入流
*
* @param path 本地檔案路徑
* @param encoding 編碼
* @return
*/
public static InputStream toInputStream(String path, String encoding) {
return IOUtils.toInputStream(path, Charset.forName(encoding));
}
/**
* 關閉輸入流和輸出流
*
* @param is
* @param os
*/
public synchronized static void close(InputStream is, OutputStream os) {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
log.info("關閉讀寫流失敗", e);
}
}
public static String convertLinuxPath(String path) {
String osName = System.getProperty("os.name");
if (!"Linux".equals(osName)) {
if (path.contains(":")) {
path = path.substring(2);
}
// path = StringUtils.replaceAll(path, "\\", "/");
}
return path;
}
}