微信现在占据的磁盘越来越大,工作的时候老是被人重复发文件,遂有用代码删除的心思(考虑到可能有不放心的情况,这里就只是打印路径,不删除文件)。
基本思路:
1. 扫描指定文件夹
2. 使用MAP<String,List<String,File>>记录全部文件,是文件记录MD5值和路径,是文件夹递归调用。MD5作为Key,文件集合作为value
上菜。
/**
* 获取重复的文件
* @param dirPath 文件地址
* @return 重复信息
*/
public static Map<String, List<File>> getRepeatFileByPath(String dirPath) {
Map<String, List<File>> repeatFile = new HashMap<>();
Map<String, List<File>> fileMap = new HashMap<>();
File dir = new File(dirPath);
getFilePathMd5(fileMap, dir);
fileMap.keySet().stream().filter(key -> fileMap.get(key).size() != 1).forEach(key -> {
repeatFile.put(key, fileMap.get(key));
LogPrintUtil.info(String.format("MD5 %s 路径文件存在重复", key));
fileMap.get(key).forEach(it -> LogPrintUtil.info(it.getAbsolutePath()));
});
if (repeatFile.keySet().size() == 0) {
LogPrintUtil.info("该目录下文件不存在重复");
}
return repeatFile;
}
/**
* 读取指定目录下的全部文件,返回MD5+文件list
* @param fileMap MD5+文件list
* @param file 文件或目录
*/
private static void getFilePathMd5(Map<String, List<File>> fileMap, File file) {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File oneFile : files) {
getFilePathMd5(fileMap, oneFile);
}
}
} else {
String key = MD5Util.getMD5(file);
Optional<String> first = fileMap.keySet().stream().filter(it -> it.equals(key)).findFirst();
if (!first.isPresent()) {
List<File> fileList = new ArrayList<>();
fileMap.put(key, fileList);
}
fileMap.get(key).add(file);
}
}
封装完毕后对外接口
public class CheckRepeatFile { public static void main(String[] args) { if (args.length == 1) { FileUtil.getRepeatFileByPath(args[0]); } else { LogPrintUtil.error("参数错误"); } } }
打成jar,触发指令如下:
java -classpath owlMagicUtil-3.0.4.jar com.owl.main.CheckRepeatFile "F:\WorkSpaces\java\default\owlMagicModular\owlMagicUtil\target\test-classes"
结果如下