L'elenco dei file nella directory sorgente me lo ritrovo in un array di oggetti File (uso il metodo list() della classe File per ottenerlo).
L'elenco dei file nella directory di destinazione mi arriva inizialmente in List<FileIdBothDirectoryInformation>, che poi scorro per togliere di mezzo le directory e buttarli dentro un HashMap<String, FileIdBothDirectoryInformation> [chiave = nome del file]. In questo modo, quando poi andrò a scorrere l'array sorgente, posso usare il nome del file per indicizzare la mappa e ottenere il corrispondente FileIdBothDirectoryInformation (se esiste).
Questo il pezzo di codice che effettua sta cosa (dstContent è il List<FileIdBothDirectoryInformation> che ottengo dal listing della directory di destinazione):
// Costruisco una mappa di soli FILE (tralascio le directory) per andare bene a lavorarci su
HashMap<String, FileIdBothDirectoryInformation> mappaFilesDst = new HashMap<>();
for(FileIdBothDirectoryInformation entry : dstContent) {
if (!EnumWithValue.EnumUtils.isSet(entry.getFileAttributes(), FileAttributes.FILE_ATTRIBUTE_DIRECTORY)) {
// NON è una directory: lo aggiungo alla mappa
mappaFilesDst.put(entry.getFileName(), entry);
}
}
Inizialmente avevo usato un TreeMap, ma poi mi sono reso conto che non mi serve l'ordinamento delle chiavi.
Volendo si può ridurre tutto il ciclo usando gli stream:
Map<String, FileIdBothDirectoryInformation> mappaFilesDst =
dstContent.stream()
.filter(e -> !EnumWithValue.EnumUtils.isSet(e.getFileAttributes(), FileAttributes.FILE_ATTRIBUTE_DIRECTORY))
.collect(Collectors.toMap(FileIdBothDirectoryInformation::getFileName, Function.identity()));