生成文件树小工具
之前写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集合中。
网友评论