вівторок, 18 вересня 2012 р.

Как в Java сравнить содержимое двух директорий

Возникла необходимость сравнить две директории по содержимому. Готового решения гугл не подсказал, пришлось городить собственное решение.



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

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments