java程式碼掃描MD5相同重複檔案
阿新 • • 發佈:2021-01-21
微信現在佔據的磁碟越來越大,工作的時候老是被人重複發文件,遂有用程式碼刪除的心思(考慮到可能有不放心的情況,這裡就只是列印路徑,不刪除檔案)。
基本思路:
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"
結果如下