2014-12-29 146 views
0

我一直在開發一個重複的查找程序。我目前面臨的挑戰是計算在文件夾和子文件夾中找到的重複文件的數量。計算文件時遇到問題

我的代碼的作用是:只要它到達具有重複項的特定文件,它就會計數正確,但當它到達具有多個項的不同文件時,它將從頭開始。

這不是我想要的。我想要的是它計算具有多個副本的文件總數。

這裏是我的代碼:

public void findDuplicateFiles(File[] files) throws IOException { 

    Map<String, List<File>> filesByHash = new HashMap<>(); 
    int number = 0; 

    for (File file : files) { 
     if (!file.isFile()) { 
      findDuplicateFiles(file.listFiles()); 
      continue; 
     } 
     MD5.initNativeLibrary(); 
     String hash = MD5.asHex(MD5.getHash(file)); 

     List<File> filesForHash = filesByHash.get(hash); 
     if (filesForHash == null) { 
      filesByHash.put(hash, filesForHash = new ArrayList<>()); 
     } 

     filesForHash.add(file); 
    } 

    for (Map.Entry<String, List<File>> entry : filesByHash.entrySet()) { 
     List<File> filesForHash = entry.getValue(); 
     if (filesForHash.size() > 1) { 
      String hash = entry.getKey(); 
      System.out.printf("%,d files have hash %s:%n", 
        filesForHash.size(), hash); 
      int index = filesForHash.size() - 1; 
      filesForHash.remove(index); 
      DefaultListModel model = (DefaultListModel) list.getModel(); 

      for (File file : filesForHash) { 
       // This is where things goes wrong 
       File fs = file.getAbsoluteFile(); 
       for (int i = 1; i <= fs.length(); i++); 
        number++; 
       //count.setText(number + " Files"); 
       //model.addElement(file); 
       System.out.println(" " + file); 
       System.out.println(number + " Files"); 
      } 
     }; 
    } 
    //System.out.println(" No Duplicate Found "); 
} 

貝婁是結果我得到:

6 files have hash da8f60e8474f7c89f368e5d6d379dcdc: 
C:\Users\Mbaegbu\Documents\Bandicam\files\bandicam 2014-07-02 10-55-03-421 -   Copy  (2).jpg 
1 Files 
C:\Users\Mbaegbu\Documents\Bandicam\files\bandicam 2014-07-02 10-55-03-421 -   Copy  (3).jpg 
    2 Files 
    C:\Users\Mbaegbu\Documents\Bandicam\files\bandicam 2014-07-02 10-55-03-421 -   Copy  (4).jpg 
    3 Files 
    C:\Users\Mbaegbu\Documents\Bandicam\files\bandicam 2014-07-02 10-55-03-421 -   Copy  (5).jpg 
    4 Files 
    C:\Users\Mbaegbu\Documents\Bandicam\files\bandicam 2014-07-02 10-55-03-421 - Copy.jpg 
    5 Files 
    2 files have hash da8f60e8474f7c89f368e5d6d379dcdc: 
    C:\Users\Mbaegbu\Documents\Bandicam\bandicam 2014-07-02 10-55-03-421 - Copy.jpg 
    1 Files 
    3 files have hash f884c30bfad89a285507d4c381700583: 
    C:\Users\Mbaegbu\Documents\Bandicam\bandicam 2014-07-16 22-09-14-091 - Copy -   Copy.jpg 
    2 Files 
    C:\Users\Mbaegbu\Documents\Bandicam\bandicam 2014-07-16 22-09-14-091 - Copy.jpg 
    3 Files 
+0

什麼是你的問題? – Regent

+0

你的問題究竟是什麼不明確。例子會很好,就像這些文件,重複和當前的解決方案,我得到這個,我想這個。 – SMA

+0

對不起......我已更新該帖子。 – emekamba

回答

0

它看起來像你做一個遞歸調用每一個你遇到的目錄,但每次調用你的方法初始化一個新的Map,因此所有先前找到的文件都被忽略。

你應該將你的方法分成兩部分。
一個遞歸方法,它會接受一個Map作爲參數並向它添加條目。
一個可以創建Map的非遞歸方法,首先調用遞歸方法,然後根據Map的內容打印結果。

的非遞歸方法:

public void findDuplicateFiles(File file) throws IOException 
{ 
    Map<String, List<File>> filesByHash = new HashMap<>(); 
    if (!file.isFile()) 
     findDuplicateFiles(file.listFiles(), fileByHash); 

    for (Map.Entry<String, List<File>> entry : filesByHash.entrySet()) { 
     List<File> filesForHash = entry.getValue(); 
     .... 
    } 
} 

遞歸方法:

public void findDuplicateFiles(File[] files, Map<String, List<File>> fileByHash) throws IOException 
{ 

    int number = 0; 

    for (File file : files) { 
     if (!file.isFile()) { 
      findDuplicateFiles(file.listFiles(),fileByHash); 
      continue; 
     } 
     MD5.initNativeLibrary(); 
     String hash = MD5.asHex(MD5.getHash(file)); 

     List<File> filesForHash = filesByHash.get(hash); 
     if (filesForHash == null) { 
      filesByHash.put(hash, filesForHash = new ArrayList<>()); 
     } 

     filesForHash.add(file); 
    } 
} 
+0

@伊蘭我已經更新了我的文章....請你能闡明更多的光芒? – emekamba

+0

嘿伊蘭我仍然面臨challanges,在你的代碼後面,當我運行代碼時,沒有什麼會發生。你有下一步該做什麼的想法嗎? – emekamba