Java 无法计数文件

Java 无法计数文件,java,hash,Java,Hash,我已经开发了一段时间的重复查找器。我目前面临的挑战是计算在文件夹和子文件夹中找到的重复文件的数量 我的代码所做的是:每当它到达一个具有重复项的特定文件时,它的计数是正确的,但是当它到达一个具有多个重复项的不同文件时,它从一开始就开始计算 那不是我想要的。我想要的是,它计算具有多个副本的文件总数 这是我的密码: public void findDuplicateFiles(File[] files) throws IOException { Map<String, List<

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

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

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

这是我的密码:

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 ");
}

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

您应该将方法分成两部分。
一个递归方法,将接受映射作为参数并向其添加条目。
一个非递归方法,它将创建映射,第一次调用递归方法,最后根据映射的内容打印结果

非递归方法:

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);
    }
}
public void findDuplicateFiles(文件文件)引发IOException
{
Map filesByHash=new HashMap();
如果(!file.isFile())
findDuplicateFiles(file.listFiles(),fileByHash);
for(Map.Entry:filesByHash.entrySet()){
List filesForHash=entry.getValue();
....
}
}
递归方法:

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);
    }
}
public void findDuplicateFiles(File[]files,Map fileByHash)引发IOException
{
整数=0;
用于(文件:文件){
如果(!file.isFile()){
findDuplicateFiles(file.listFiles(),fileByHash);
持续
}
MD5.initNativeLibrary();
String hash=MD5.asHex(MD5.getHash(file));
List filesForHash=filesByHash.get(hash);
if(filesForHash==null){
put(hash,filesForHash=newarraylist());
}
filesForHash.add(文件);
}
}

您的问题是什么?您的问题到底是什么还不清楚。示例很好,这些是文件、副本和当前解决方案,我得到了这个,我想要这个。很抱歉……我已经更新了帖子。@Regent我已经更新了代码。嘿,Eran,我仍然面临挑战,在遵循您的代码之后,当我运行代码时,什么都没有发生。你知道下一步该做什么吗?