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