文件处理工具类


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sun.org.apache.xpath.internal.operations.Bool;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.params.HttpParams;
import org.eclipse.jgit.api.Git;

import java.io.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

import static org.springframework.util.FileCopyUtils.BUFFER_SIZE;

@Slf4j
public class FileUtils {

    private static Integer id = 0;

    private static final String WORK_PATH = File.separator + "root" + File.separator + "work";

    public static String getGitPath(String rootPath, String aimsPath) {
        String gitPath = "";
        Map map = new HashMap<>();
        try {
            getFilePath(rootPath, map, aimsPath);
            gitPath = map.get(aimsPath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return gitPath;
    }

    public static void getFilePath(String rootPath, Map map, String aimsPath) throws FileNotFoundException {
//        log.info("rootPath:" + rootPath);
        File file = new File(rootPath);
        //1.判断文件
        if (!file.exists()) {
            throw new FileNotFoundException("文件不存在");
        }
        if (file.isDirectory()) {
            String name = file.getName();
            String path = file.getAbsolutePath();
            String temp = path.substring(path.length() - aimsPath.length());
            if (aimsPath.equals(temp)) {
                String gitPath = path.replace(aimsPath, "");
                try {
                    Git.open(new File(gitPath));
                    map.put(name, gitPath);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            String[] lists = file.list();
            for (int i = 0; i < lists.length; i++) {
                String s = lists[i];
                String newFilePath = path + File.separator + s;//根据当前文件夹,拼接其下文文件形成新的路径
                getFilePath(newFilePath, map, aimsPath);
            }
        }
    }


    public static Tree bachFile(String filepath, int parentId) throws FileNotFoundException {
        File file = new File(filepath);
        Tree tree = new Tree();
        //1.判断文件
        if (!file.exists()) {
            throw new FileNotFoundException("文件不存在");
        }
        //2.是文件该怎么执行
        if (file.isFile() && !file.isHidden()) {
            String name = file.getName();
            String path = file.getAbsolutePath();
            tree.setId(id++);
            tree.setName(name);
            tree.setPath(path);
            tree.setLeaf(true);
            tree.setParentId(parentId);
        }
        return tree;
    }

    public static List bachFolderUpLevel(String filepath, Integer parentId, List filePathList) throws FileNotFoundException {
        Integer sunId = parentId;
        File file = new File(filepath);
        List sonList = new ArrayList<>();
        //1.判断文件
        if (!file.exists()) {
            throw new FileNotFoundException("文件不存在");
        }
        //2.是文件该怎么执行
        if (file.isFile() && !file.isHidden()) {
            String name = file.getName();
            String path = file.getAbsolutePath();
            Tree tree = new Tree(sunId++, name, path, parentId);
            for (String filePath : filePathList) {
                if (StringUtils.contains(filePath, name)) {
                    tree.setDefect(true);
                    break;
                }
            }
            sonList.add(tree);
        }
        //3.获取文件夹路径下面的文件
        if (file.isDirectory() && !file.isHidden() && !".git".equals(file.getName()) && !".idea".equals(file.getName())) {
            String name = file.getName();
            String path = file.getAbsolutePath();
            String[] lists = file.list();
            for (int i = 0; i < lists.length; i++) {
                String s = lists[i];
                String newFilePath = path + File.separator + s;
                Tree tree = new Tree(sunId++, name, newFilePath, parentId);
                sonList.add(tree);
            }
        }
        return sonList;
    }

    public static Boolean checkFilePrefix(File file) {
        Boolean flag = true;
        String fileName = file.getName();
        String prefix = fileName.substring(fileName.lastIndexOf(".") + 1);
        if (org.eclipse.jgit.util.StringUtils.equalsIgnoreCase(prefix, "zip") || org.eclipse.jgit.util.StringUtils.equalsIgnoreCase(prefix, "tar") || org.eclipse.jgit.util.StringUtils.equalsIgnoreCase(prefix, "gz")
                || org.eclipse.jgit.util.StringUtils.equalsIgnoreCase(prefix, "tgz") || org.eclipse.jgit.util.StringUtils.equalsIgnoreCase(prefix, "bz2") || org.eclipse.jgit.util.StringUtils.equalsIgnoreCase(prefix, "tbz2")
                || org.eclipse.jgit.util.StringUtils.equalsIgnoreCase(prefix, "rar") || org.eclipse.jgit.util.StringUtils.equalsIgnoreCase(prefix, "jar") || org.eclipse.jgit.util.StringUtils.equalsIgnoreCase(prefix, "wat")) {
            flag = false;
        }
        return flag;
    }

//    public static void file(String filepath, int parentId, List list, List filePathList) throws FileNotFoundException {
//        ArrayList parentNode = new ArrayList<>();
//        file(filepath, parentId, list, filePathList, parentNode);
//    }

    public static Boolean file(String filepath, int parentId, List list, List filePathList) throws FileNotFoundException {
        File file = new File(filepath);
        Boolean ifDefect = false;
//        ArrayList newParentNode =(ArrayList) parentNode.clone();
        //1.判断文件
        if (!file.exists()) {
            throw new FileNotFoundException("文件不存在");
        }
        //2.是文件该怎么执行
        if (file.isFile() && !file.isHidden() && checkFilePrefix(file)) {
            String name = file.getName();
            String path = file.getAbsolutePath();
            Tree tree = new Tree(id++, name, path, parentId);
            for (String filPath : filePathList) {
                if (StringUtils.contains(filPath, name)) {
                    tree.setDefect(true);
                    ifDefect = true;
                }
            }
            tree.setLeaf(true);
            list.add(tree);
        }
        //3.获取文件夹路径下面的所有文件递归调用;
        if (file.isDirectory() && !file.isHidden() && !".git".equals(file.getName()) && !".idea".equals(file.getName()) && !"target".equals(file.getName())) {
            log.info("fileName===" + file.getName());
            String name = file.getName();
            String path = file.getAbsolutePath();
            Tree tree = new Tree(id++, name, path, parentId);
            list.add(tree);
            String[] lists = file.list();
            String parent = file.getParent();
            for (int i = 0; i < lists.length; i++) {
                String s = lists[i];
                String newFilePath = path + File.separator + s;//根据当前文件夹,拼接其下文文件形成新的路径
                Boolean childIfDefect = file(newFilePath, tree.getId(), list, filePathList);
                if (childIfDefect) {
                    ifDefect = true;
                }
            }
            tree.setDefect(ifDefect);
        }
        return ifDefect;
    }

    /**
     * - listToTree
     * - 

方法说明

* - 将JSONArray数组转为树状结构 * - @param arr 需要转化的数据 * - @param id 数据唯一的标识键值 * - @param pid 父id唯一标识键值 * - @param children 子节点键值 * - @return JSONArray */ public static JSONArray listToTree(JSONArray arr, String id, String pid, String children) { JSONArray r = new JSONArray(); JSONObject hash = new JSONObject(); //将数组转为Object的形式,key为数组中的id for (int i = 0; i < arr.size(); i++) { JSONObject json = (JSONObject) arr.get(i); hash.put(json.getString(id), json); } //遍历结果集 for (int j = 0; j < arr.size(); j++) { //单条记录 JSONObject aVal = (JSONObject) arr.get(j); //在hash中取出key为单条记录中pid的值 JSONObject hashVP = (JSONObject) hash.get(aVal.get(pid).toString()); //如果记录的pid存在,则说明它有父节点,将她添加到孩子节点的集合中 if (hashVP != null) { //检查是否有child属性 if (hashVP.get(children) != null) { JSONArray ch = (JSONArray) hashVP.get(children); ch.add(aVal); hashVP.put(children, ch); } else { JSONArray ch = new JSONArray(); ch.add(aVal); hashVP.put(children, ch); } } else { r.add(aVal); } } return r; } public static List getAllFile(String filePath) { File f = new File(filePath); File[] fileInF = f.listFiles(); // 得到f文件夹下面的所有文件。 List list = new ArrayList<>(); for (File file : fileInF) { list.add(file); } return list; } public static String readTxt(String filePath) throws IOException { StringBuilder result = new StringBuilder(); BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filePath)), "UTF-8")); String lineTxt = null; while ((lineTxt = bfr.readLine()) != null) { result.append(lineTxt).append("\n"); } bfr.close(); return result.toString(); } /** * 下载文件 * * @param url 下载地址 * @return 本地保存地址 */ private static boolean download(String url, String fileName) { String[] instructions = new String[3]; instructions[1] = "-c"; String osName = System.getProperty("os.name"); // 判断系统是否为windows操作系统 String systemName = "Windows"; if (osName.contains(systemName)) { instructions[0] = "bash"; } else { instructions[0] = "sh"; } String instruction = String.format("wget -q %s -O %s && echo $?", url, fileName); instructions[2] = instruction; String execute = ExecuteScriptUtils.execute(instructions); return "0".equals(execute); } /** * 解压文件 * * @param filePath 文件地址 * @param destDirPath 目标路径 * @param scanApplication 文件名称 * @return */ public static Boolean unZipOpt(String filePath, String destDirPath, String scanApplication) { String[] instructions = new String[3]; instructions[1] = "-c"; String outPath = scanApplication == null ? destDirPath : destDirPath + scanApplication + File.separator; String osName = System.getProperty("os.name"); // 判断系统是否为windows操作系统 String systemName = "Windows"; if (osName.contains(systemName)) { instructions[0] = "bash"; } else { instructions[0] = "sh"; } String instruction = String.format("unzip -o %s -d %s && echo $?", filePath, outPath); instructions[2] = instruction; String execute = ExecuteScriptUtils.execute(instructions); return "0".equals(execute); } /** * 删除文件 * * @param filePath * @return */ public static Boolean deletefile(String filePath) { String[] instructions = new String[3]; instructions[1] = "-c"; String osName = System.getProperty("os.name"); // 判断系统是否为windows操作系统 String systemName = "Windows"; if (osName.contains(systemName)) { instructions[0] = "bash"; } else { instructions[0] = "sh"; } String instruction = String.format("rm -rf %s && echo $?", filePath); instructions[2] = instruction; String execute = ExecuteScriptUtils.execute(instructions); return "0".equals(execute); } public static Boolean unZip(File srcFile, String destDirPath, String scanApplication) throws RuntimeException { Boolean flag = false; long start = System.currentTimeMillis(); // 判断源文件是否存在 if (!srcFile.exists()) { throw new RuntimeException(srcFile.getPath() + "所指文件不存在"); } // 开始解压 ZipFile zipFile = null; try { zipFile = new ZipFile(srcFile, Charset.forName("GBK")); Enumeration<?> entries = zipFile.entries(); if (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); log.info("rootFile:" + entry.getName() + "scanApplication:" + scanApplication + File.separator); String name = entry.getName().substring(0, entry.getName().length() - 1); /*if (!StringUtils.equals(scanApplication, name)) { log.info("zip包中 不带服务名 文件夹的: " + scanApplication); destDirPath = destDirPath + File.separator + scanApplication; }*/ } while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); // log.info("解压" + entry.getName()); // 如果是文件夹,就创建个文件夹 if (entry.isDirectory()) { String dirPath = destDirPath + "/" + entry.getName(); File dir = new File(dirPath); dir.mkdirs(); } else { // 如果是文件,就先创建一个文件,然后用io流把内容copy过去 File targetFile = new File(destDirPath + "/" + entry.getName()); // 保证这个文件的父文件夹必须要存在 if (!targetFile.getParentFile().exists()) { targetFile.getParentFile().mkdirs(); } targetFile.createNewFile(); // 将压缩文件内容写入到这个文件中 InputStream is = zipFile.getInputStream(entry); FileOutputStream fos = new FileOutputStream(targetFile); int len; byte[] buf = new byte[BUFFER_SIZE]; while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } // 关流顺序,先打开的后关闭 fos.close(); is.close(); } } long end = System.currentTimeMillis(); log.info("解压完成,耗时:" + (end - start) + " ms"); flag = true; } catch (Exception e) { log.error("下载的文件格式不正确,将文件删除"); e.printStackTrace(); CodeLineQuantityUtils.delFolder(destDirPath); flag = false; } finally { if (zipFile != null) { try { zipFile.close(); } catch (IOException e) { e.printStackTrace(); } } } return flag; } /** * 下载文件 * * @param url 下载地址 * @return 本地保存地址 */ public static boolean downloadBack(String url, String fileName) { HttpClient client = new HttpClient(); GetMethod get = null; FileOutputStream output = null; String localFileName = ""; Boolean result = false; try { get = new GetMethod(url); int i = client.executeMethod(get); localFileName = fileName; if (200 == i) { File storeFile = new File(localFileName); output = new FileOutputStream(storeFile); output.write(get.getResponseBody()); result = true; } else { log.info("DownLoad file occurs exception, the error code is :" + i); } } catch (Exception e) { e.printStackTrace(); return false; } finally { try { if (output != null) { output.close(); } } catch (IOException e) { e.printStackTrace(); } assert get != null; get.releaseConnection(); client.getHttpConnectionManager().closeIdleConnections(0); } return result; } public static String readFileContent(String fileName) { File file = new File(fileName); return readFileContent(file); } public static String readFileContent(File file) { BufferedReader reader = null; StringBuffer sbf = new StringBuffer(); try { InputStreamReader inputReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); reader = new BufferedReader(inputReader); String tempStr; while ((tempStr = reader.readLine()) != null) { sbf.append(tempStr + "\n"); } reader.close(); return sbf.toString(); } catch (IOException e) { log.error(e.getMessage()); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { e1.printStackTrace(); } } } return sbf.toString(); } public static Boolean downLoadAndUnZipFile(String scanApplication, String newRepo, String codePath, String fileName) { Boolean downloadFlag = FileUtils.download(newRepo, codePath + fileName); Boolean unZipFlag = false; String filePath = codePath + fileName; while (true) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } if (downloadFlag && new File(filePath).exists()) { log.info("下载 zip成功 开始解压"); // File file1 = new File(filePath); // unZipFlag = FileUtils.unZip(file1, codePath, scanApplication); unZipFlag = unZipOpt(filePath, codePath, scanApplication); break; } } if (unZipFlag) { deletefile(filePath); log.info("解压成功 删除源文件"); } return (downloadFlag && unZipFlag); } public static void deleteStoreFile(String path, String token, String timestamp) { String url = UrlUtil.STONED + "?path=" + path + "&token=" + token + "×tamp=" + timestamp; HttpRequestUtil.doDelete(url); } }

相关