1. 程式人生 > 其它 >java獲取檔案目錄樹,建立資料夾、刪除資料夾

java獲取檔案目錄樹,建立資料夾、刪除資料夾

技術標籤:java

目錄

1.FileInfo實體類

2.service介面

3. impl實現

4.Controller實現

5.工具類


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;
    }

}