我已经开发了一段时间的重复查找器。我目前面临的挑战是计算在文件夹和子文件夹中找到的重复文件的数量。
我的代码所做的是:每当它到达具有重复项的特定文件时,它都会计算正确,但当它到达具有多个重复项的不同文件时,它会从头开始。
这不是我想要的。我想要的是它计算具有多个副本的文件的总数。
下面是我的代码:
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发布于 2014-12-29 15:06:49
看起来您对遇到的每个目录都进行了一个递归调用,但是每次调用您的方法都会初始化一个新的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);
}
}https://stackoverflow.com/questions/27684712
复制相似问题