美文网首页
markdown文件的生成文件树小工具

markdown文件的生成文件树小工具

作者: Derek_LD | 来源:发表于2020-07-12 19:20 被阅读0次

    生成文件树小工具

    ​ 之前写md的时候,每次添加项目文件结构都比较费劲,要么一个一个复制粘贴+手敲。要么各种百度搜看有没有好用的插件。但是找了几圈没发现哪个可以很好用。于是自己写了一个,主要就是把没用的文件直接过滤掉。

    虽然写的不怎么样,但好歹是自己想要的样子。这样日后在添加文件树就很方便了。

    • 工具生成文件树样式:
    └── derek_ld
        ├── src
        │   └── main
        │       ├── java
        │       │   └── com
        │       │       └── woshild
        │       │           └── derek_ld
        │       │               ├── lombok
        │       │               └── DerekLdApplication.java
        │       └── resources
        │           ├── mapper
        │           │   └── TestTreeMapper.xml
        │           └── application.properties
        └── pom.xml
    

    代码:

    package com.woshild.derek_ld.lombok;
    
    import lombok.SneakyThrows;
    import lombok.extern.slf4j.Slf4j;
    
    import java.io.File;
    import java.util.*;
    /**
     *
     * 打印文件树小工具
     *
     * @Author LD
     * @Date 2020-7-12 04:40:35 上午
     * @Email: 475534443@qq.com
     */
    
    @Slf4j
    public class PrintProjectFileForTreeUtil {
    
        /**
         * 自定义打印文件树工具
         * @param args
         */
        @SneakyThrows
        public static void main(String[] args) {
           String projectDir = System.getProperty("user.dir");
            printProjectFileForTree(projectDir, 1, true, new HashSet<>());
        }
    
        // 文件过滤 按文件类型过滤 如*.iml  *.json  *.txt   注意: 文件夹.idea   .git也需要在此处添加
        private static Set<String> fileIgnoreSet = new HashSet<>();
        // 文件过滤 纯按文件名进行过滤
        private static Set<String> folderIgnoreSet = new HashSet<>();
        // 文件夹过滤
        private static Set<String> patternFileName = new HashSet<>();
    
        static {
            patternFileName.add("iml");
            patternFileName.add("json");
            patternFileName.add("txt");
            patternFileName.add("idea");
            patternFileName.add("git");
            patternFileName.add("mvn");
            patternFileName.add("mvnw");
            patternFileName.add("cmd");
            patternFileName.add("DS_Store");
            patternFileName.add("log");
            patternFileName.add("sql");
    
            fileIgnoreSet.add(".gitignore");
            fileIgnoreSet.add("logback.xml");
            fileIgnoreSet.add("mime-type.properties");
            fileIgnoreSet.add("HELP.md");
            fileIgnoreSet.add("PrintProjectFileForTreeUtil.java");
    
            folderIgnoreSet.add(".idea");
            folderIgnoreSet.add("test");
            folderIgnoreSet.add(".mvn");
            folderIgnoreSet.add("target");
            folderIgnoreSet.add("static");
            folderIgnoreSet.add("templates");
            folderIgnoreSet.add(".git");
            folderIgnoreSet.add("logs");
        }
    
        private static String ROOT = "└── ";
        private static String NOTROOT = "├── ";
        private static String SPLIT = "│   ";
        private static String SPACE = "    ";
    
        /**
         * 打印Tree结构
         * @param dir   文件目录
         * @param level   当前目录级别
         * @param laseFile  是否为最后一个文件
         * @param printSplitIndex  需要打印分割线的位置
         */
        private static void printProjectFileForTree(String dir, int level, boolean laseFile, Set<Integer>  printSplitIndex) {
            File file = new File(dir);
            String fileName = file.getName();
            // 处理文件夹类型
            if (file.isDirectory() && !folderIgnoreSet.contains(fileName)) {
    
                for (int i = 1; i < level; i ++) {
                    if (printSplitIndex.contains(i)) {
                        System.out.print(SPLIT);
                    } else {
                        System.out.print(SPACE);
                    }
                }
    
                File[] files = file.listFiles();
                List<File> fileList = Arrays.asList(files);
                fileList = remove(fileList);
                // 按照名称和文件夹进行排序
                Collections.sort(fileList, (f1, f2) -> {
                    if (f1.isDirectory() && f2.isFile())
                        return -1;
                    if (f1.isFile() && f2.isDirectory())
                        return 1;
                    return f1.getName().compareTo(f2.getName());
                });
    
                // 是否需要打印 └── 或者 ├──
                boolean printSplit = fileList.size() == 1 ? true : false;
    
                Set<Integer> newPrintSplitIndex = new HashSet<>();
                newPrintSplitIndex.addAll(printSplitIndex);
                if ((level == 1 || !printSplit)) {
                    if (laseFile) {
                        System.out.print(ROOT);
                    } else {
                        newPrintSplitIndex.add(level);
                        System.out.print(NOTROOT);
                    }
                } else {
                    if (laseFile) {
                        System.out.print(ROOT);
                    } else {
                        newPrintSplitIndex.add(level);
                        System.out.print(NOTROOT);
                    }
    
                }
                System.out.println(fileName);
                for (File folderDown : fileList) {
                    // 判断文件是否为最后一个文件,决定是否需要打印 └── 或者 ├──
                    boolean isLast = (folderDown == fileList.get(fileList.size() - 1)) ? true : false;
                    printProjectFileForTree(dir + "/" + folderDown.getName(), level + 1, isLast, newPrintSplitIndex);
                }
            }
            // 处理文件类型
            if (file.isFile()) {
                String postFix = fileName;
                if (fileName.split("\\.").length > 1) {
                    postFix = fileName.split("\\.")[1];
                }
                if (!fileIgnoreSet.contains(fileName) && !patternFileName.contains(postFix)) {
                    for (int i = 1; i < level; i ++) {
                        if (printSplitIndex.contains(i)) {
                            System.out.print(SPLIT);
                        } else {
                            System.out.print(SPACE);
                        }
                    }
                    if (laseFile) {
                        System.out.print(ROOT);
                    } else {
                        System.out.print(NOTROOT);
                    }
    
                    System.out.println(fileName);
                }
            }
        }
    
        /**
         * 移除需要过滤的文件或文件夹
         * @param files
         * @return
         */
        private static List<File> remove(List<File> files) {
            List<File> newFiles = new ArrayList<>();
            for (File file : files) {
                if (file.isDirectory()) {
                    if (!folderIgnoreSet.contains(file.getName())) {
                        newFiles.add(file);
                    }
                } else {
                    String postFix = file.getName();
                    if (file.getName().split("\\.").length > 1) {
                        postFix = file.getName().split("\\.")[1];
                    }
                    if (!fileIgnoreSet.contains(file.getName()) && !patternFileName.contains(postFix)) {
                        newFiles.add(file);
                    }
                }
            }
            return newFiles;
        }
    
    }
    
    • 代码拷出来放在项目中,改完package直接运行就好了。
    • 可以自定义ignore的文件或文件夹。
    • 有一点比较奇怪的是.git .idea .mvn文件夹都被解析成文件了。所以需要添加在文件的Set集合中。

    相关文章

      网友评论

          本文标题:markdown文件的生成文件树小工具

          本文链接:https://www.haomeiwen.com/subject/xtsncktx.html