首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在计算文件时遇到问题

在计算文件时遇到问题
EN

Stack Overflow用户
提问于 2014-12-29 15:01:51
回答 1查看 48关注 0票数 0

我已经开发了一段时间的重复查找器。我目前面临的挑战是计算在文件夹和子文件夹中找到的重复文件的数量。

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

这不是我想要的。我想要的是它计算具有多个副本的文件的总数。

下面是我的代码:

代码语言:javascript
复制
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 ");
}

下面是我得到的结果:

代码语言:javascript
复制
 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
EN

回答 1

Stack Overflow用户

发布于 2014-12-29 15:06:49

看起来您对遇到的每个目录都进行了一个递归调用,但是每次调用您的方法都会初始化一个新的Map,因此所有以前找到的文件都会被忽略。

你应该把你的方法一分为二。

一个递归方法,接受Map作为参数并向其中添加条目。

一个创建Map的非递归方法,对递归方法进行第一次调用,最后根据Map的内容打印结果。

非递归方法:

代码语言:javascript
复制
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();
        ....
    }
}

递归方法:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27684712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档