boolean compareDirectories(File dir1, File dir2)
throws FileNotFoundException {
/* Папок нет, разговора нет */
if (!dir1.exists())
throw new FileNotFoundException(dir1.getAbsolutePath());
if (!dir2.exists())
throw new FileNotFoundException(dir2.getAbsolutePath());
/* Аргументы либо оба директории, либо оба файлы. Иначе не схожи. */
if (dir1.isDirectory() != dir2.isDirectory()) {
return false;
}
/*
* Если первый аргумент файл, а предыдущая проверка метод не завершила,
* то сравниваем аргументы как файлы.
*/
if (dir1.isFile()) {
return compareFilesByName(dir1, dir2);
}
File[] files1 = dir1.listFiles(); // Здесь жду подвоха. Не факт, что массивы
File[] files2 = dir2.listFiles(); // сформируются в одинаковом порядке.
// Возможно нужна предварительная сортировка.
if (files1.length != files2.length) {
return false;
}
for (int i = 0; i < files1.length; i++) {
File f1 = files1[i];
File f2 = files2[i];
/* Рекурсивный вызов */
if (!compareDirectories(f1, f2)) {
return false;
}
}
return true;
}
/*
* Критерий совпадения файлов может быть разным.
* Например, совпадение имен.
*/
boolean compareFilesByName(File file1, File file2) {
return file1.getName().toLowerCase()
.equals(file2.getName().toLowerCase());
}
7 комментариев:
> Готового решения гугл не подсказал
4.2!
и этот человек что-то говорил мне про велосипеды...
за 3 секунды гугления нашел такой вариант:
diff -r dir1 dir2
картинка с Java тут не спроста ;)
уточнил
тогда другое дело ) хотя я бы не удивился, если бы ты стал писать отдельную программу для сравнению директорий. можешь считать это комплиментом )
а для указанной задачи, если просто надо сказать совпадают директории или нет по именам содержащихся в них файлов, я бы просто получил список всех файлов в обеих директориях (в классе IO есть такая функция :)), а потом сравнил оба списка. можно немного изменить функцию получения списка файлов и добавлять их имена в hashset, а не в list. тогда будет не нужна и отдельная функция сравнения - множества сравниваются функцией equals. другое дело, если директории содержат большое количество файлов, - тогда загонять все их имена в память, наверно, будет нецелесообразно.
хотя в инете встречаются и самопальные реализации того, что ты сделал.
Нюанс в том, что директория может содержать поддиректории, содержимое которых тоже надо сравнить.
ну так если сравнивать списки файлов, то этот список тоже формируется рекурсивно.
поясните мысль
Отправить комментарий