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. другое дело, если директории содержат большое количество файлов, - тогда загонять все их имена в память, наверно, будет нецелесообразно.
хотя в инете встречаются и самопальные реализации того, что ты сделал.
Нюанс в том, что директория может содержать поддиректории, содержимое которых тоже надо сравнить.
ну так если сравнивать списки файлов, то этот список тоже формируется рекурсивно.
поясните мысль
Отправить комментарий