У меня есть две папки, источник и цель, с файлами и возможными подпапками (структура директорий предполагается одинаковой, вложенные папки и файлы могут входить в любую глубину). Мы хотим, чтобы синхронизировать цель так, что для всех файлов:Как односторонняя синхронизация файлов в двух структурах каталогов в java?
Exists in source, but not in target -> new, copy over to target Exists in target, but not in source -> deleted, delete from the target Exists in both, but binary unequal -> changed, copy over from source Exists in both, and is binary equal -> unchanged, leave be
Одна проблема, я с этим является проверка существования файла (возвращаемого значения listFiles(), кажется, не имеют contains() определено), но гораздо большее препятствие ссылается на другую структуру каталогов. Например, как я могу проверить, содержит ли целевая папка файл «foo.txt», итерации через исходную папку и поиск там? Вот то, что я до сих пор:
public void synchronize(File source, File target) {
//first loop; accounts for every case except deleted
if (source.isDirectory()) {
for (File i : source.listFiles()) {
if (i.isDirectory()) {
synchronize(i, /**i's equivalent subdirectory in target*/);
}
else if (/**i is new*/) {
/**Copy i over to the appropriate target folder*/
}
else if (/**i is different*/) {
/**copy i over from source to target*/
}
else {/**i is identical in both*/
/**leave i in target alone*/
}
}
for (File i : target.listFiles()) {
if (/**i exists in the target but not in source*/) {
/**delete in target*/
}
}
}
}
EDIT (важно): Я благодарю вас, ребята за ответы на все вопросы, но основная проблема остается нерешенной: со ссылкой на другой каталог, то есть вещи, в комментариях. Ответ h22, кажется, находится где-то на футбольном поле, но этого недостаточно, как объясняется в комментарии ниже. Я был бы очень благодарен, если бы кто-нибудь мог объяснить это еще более маленькими словами. Из опыта это именно та проблема, которую может решить кто-то более здравомыслящий java за пять минут, тогда как я проведу две разочаровывающие недели, заново открыв Америку.
Если вы делаете это в окнах, вы можете просто просто вызвать команду 'xcopy', которая может выполнить тяжелую работу за вас. – bvdb
@bvdb rsync отлично работает в Windows (https://www.itefix.net/cwrsync) и Linux, может синхронизироваться через сеть и может минимизировать пропускную способность через xdelta. Однако OP, похоже, хочет использовать java. – tucuxi
Да, но мне интересно, как сильно это должно быть java :) Я имею в виду, может быть, он не знает, что есть такая вещь, как «Runtime.exec ("xcopy/rsync ..."); '. – bvdb