2014-12-29 5 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

Похоже, вы делаете рекурсивный вызов для каждого каталога вы сталкиваетесь, но каждый вызов к вашей методе инициализирует новую карту, поэтому все ранее найденные файлы игнорируются.

Вы должны разделить свой метод на два.
Один рекурсивный метод, который принимает карту как аргумент и добавляет к ней записи.
Один нерекурсивный метод, который будет создавать карту, сделать первый вызов рекурсивного метода и распечатать результаты на основе содержимого Карты в конце.

Не-рекурсивный метод:

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

@ Eran Я обновил свое сообщение .... Пожалуйста, можете ли вы пролить больше света? – emekamba

+0

Эй, Эран. Я все еще сталкиваюсь с проблемами, после того, как вы следуете своему коду, ничего не происходит, когда я запускаю код. У вас есть идея, что делать дальше? – emekamba

Смежные вопросы