Problema puntando ad un NAS con un java.io.File

di il
32 risposte

32 Risposte - Pagina 3

  • Re: Problema puntando ad un NAS con un java.io.File

    06/10/2025 - SpiritoLibero ha scritto:

    Secondo me il problema è proprio qui: perchè andare a rileggere tutta la directory per ogni file?

    ....

    4) Per ciascun oggetto della lista sorgente cerco la controparte nella lista destinazione: se non la trovo, l'elemento è da copiare, se la trovo verifico i timestamp e agisco di conseguenza.

    Il punto 4 è tutto lavoro che viene fatto in memoria (la sorgente è stata letta una sola volta e la destinazione pure).

    Amico caro questa è telepatia!  :-)
    Perché negli ultimi due giorni mi sono scervellato fino a sognarmi di notte di verificare in che ordine venivano elencati i file di origine rispetto a quelli di destinazione perché per velocizzare il tutto quelli di destinazione me li caricavo in un array ma eseguivo la verifica di un solo record perché pensavo fosse nello stesso ordine di quelli dell'origine. 
    Allora stamattina ho fatto una routine per visualizzare l'elenco dei file e ho scoperto che il listFiles di java.io.File li elenca in ordine alfabetico, mentre la list della DiskShare li elenca in un ordine strano che non è ne alfabetico ne in ordine di data di ultima modifica, per cui il mio test falliva e il programma eseguiva la copia anche di file non necessari.

    In questo processo mi occupo solo dei file perchè le directory andranno elaborate in modo ricorsivo.

    Certamente, la struttura per gestire le sottocartelle l'avevo già implementata in modo ricorsivo. ;-)

    Ovviamente, questo meccanismo si occupa solo di copiare i file nuovi/modificati da sorgente a destinazione, non va a fare considerazioni su eventuali file eliminati dalla sorgente.

    Infatti negli ultimi giorni ho modificato l'algoritmo per gestire anche la cancellazione dei file di destinazione che non sono presenti nelle cartelle sorgenti, in modo da allineare perfettamente il backup.

    Ho buttato giù un programmino di prova per verificare il discorso dei timestamp e non ho nessun tipo di problema: i file nuovi e modificati vengono correttamente copiati, mentre quelli non modificati (tra sorgente e destinazione) vengono saltati.

    Ecco a questo punto sarei curioso di sapere che tipo di struttura hai usato per memorizzare l'elenco dei file.
    Io ho usato una variabile di tipo ArrayList<String>.
    È la scelta corretta o c'è un modo più efficace e veloce?

  • Re: Problema puntando ad un NAS con un java.io.File

    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()));
  • Re: Problema puntando ad un NAS con un java.io.File

    Accipicchia! È completamente diverso da quello che ho fatto io!
    Mi rendo conto di quanto ho ancora da imparare su Java!

    Le prove che sto facendo su varie cartelle, anche con migliaia di file, sono parecchio veloci, per cui sono già contento.

    Poi vedrò di approfondire anche il tuo esempio.

    Grazie mille! ;-)

Devi accedere o registrarti per scrivere nel forum
32 risposte