无法统计文件

时间:2014-12-29 07:01:51

标签: java hash

我一直在开发一个重复的查找器。我目前面临的挑战是计算在文件夹和子文件夹中找到的重复文件的数量。

我的代码所做的是:每当它到达具有重复项的特定文件时它都是正确的,但是当它到达具有多个重复项的不同文件时,它从头开始。

这不是我想要的。我想要的是它计算具有多个重复项的文件总数。

这是我的代码:

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

1 个答案:

答案 0 :(得分: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);
    }
}