Java File.renameTo()
è problematico, specialmente su Windows, a quanto pare. Come dice la documentazione API ,
Molti aspetti del comportamento di questo metodo sono intrinsecamente dipendenti dalla piattaforma: l'operazione di ridenominazione potrebbe non essere in grado di spostare un file da un file system a un altro, potrebbe non essere atomico e potrebbe non riuscire se un file con il percorso astratto di destinazione esiste già. Il valore restituito deve essere sempre controllato per assicurarsi che l'operazione di ridenominazione sia stata eseguita correttamente.
Nel mio caso, come parte di una procedura di aggiornamento, ho bisogno di spostare (rinominare) una directory che può contenere gigabyte di dati (molte sottodirectory e file di varie dimensioni). Lo spostamento viene sempre eseguito all'interno della stessa partizione / unità, quindi non è necessario spostare fisicamente tutti i file sul disco.
Non dovrebbe esserci alcun blocco di file sul contenuto della directory da spostare, ma ancora, abbastanza spesso, renameTo () non riesce a fare il suo lavoro e restituisce false. (Sto solo immaginando che forse alcuni blocchi di file scadono in modo arbitrario su Windows.)
Attualmente ho un metodo di fallback che utilizza la copia e l'eliminazione, ma questo fa schifo perché potrebbe richiedere molto tempo, a seconda delle dimensioni della cartella. Sto anche pensando di documentare semplicemente il fatto che l'utente può spostare la cartella manualmente per evitare di aspettare per ore, potenzialmente. Ma la via giusta sarebbe ovviamente qualcosa di automatico e veloce.
Quindi la mia domanda è : conosci un approccio alternativo e affidabile per eseguire un rapido spostamento / rinomina con Java su Windows , con JDK semplice o con qualche libreria esterna. Oppure, se conosci un modo semplice per rilevare e rilasciare eventuali blocchi di file per una determinata cartella e tutti i suoi contenuti (possibilmente migliaia di singoli file), anche quello andrebbe bene.
Modifica : in questo caso particolare, sembra che siamo riusciti a usarlo solo renameTo()
prendendo in considerazione alcune cose in più; vedi questa risposta .