1. 程式人生 > 其它 >java程式碼掃描MD5相同重複檔案

java程式碼掃描MD5相同重複檔案

技術標籤:盛開java

微信現在佔據的磁碟越來越大,工作的時候老是被人重複發文件,遂有用程式碼刪除的心思(考慮到可能有不放心的情況,這裡就只是列印路徑,不刪除檔案)。

基本思路:

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"

結果如下