2013-03-08 9 views
7

Ho un codice progettato per aprire un file master locale, aggiungere aggiunte e salvare il file sovrascrivendo il file master e sovrascrivendo una copia protetta da scrittura in un percorso di rete accessibile . Ciò avviene salvando il file modificato in un file temporaneo e quindi copiando gli altri due file.Java Files.copy sostituisce completamente il file di eliminazione esistente

String tempFileName= "File.tmp"; 
String fileName= "File.xlsm"; 
String serverPath="\\\\network path\\"; 
File serverFile = new File(serverPath+fileName); 

Files.copy(Paths.get(tempFileName),Paths.get(fileName), 
    StandardCopyOption.COPY_ATTRIBUTES,StandardCopyOption.REPLACE_EXISTING); 

if(serverFile.exists()){serverFile.setWritable(true, false);} 

Files.copy(Paths.get(tempFileName),Paths.get(serverPath+fileName), 
    StandardCopyOption.COPY_ATTRIBUTES,StandardCopyOption.REPLACE_EXISTING); 

serverFile.setWritable(false,false); 

Files.delete(Paths.get(tempFileName)); 

Questo codice funziona bene la maggior parte del tempo, però, qualche volta il codice viene completata correttamente, senza eccezione, ma con il file di percorso di rete cancellato. Il file master locale viene salvato e aggiornato correttamente, ma il file che dovrebbe esistere sulla rete è semplicemente sparito.

Ciò che rende questo più difficile è che non sono stato in grado di riprodurre questo problema in qualsiasi circostanza controllata. Quindi vi chiedo indicazioni su come ciò potrebbe verificarsi da un'operazione di copia/sovrascrittura di file.

Grazie

UPDATE:

ho avuto un presentimento e controllato i registri di accesso alla rete per il percorso del file server. La cancellazione del file si verifica se e solo se si accede al file da un utente diverso dal creatore ma non sempre. Ancora una volta, questo è accessibile in sola lettura, quindi un utente che ha il file aperto non dovrebbe influenzare la sovrascrittura di una nuova versione e la maggior parte delle volte non lo fa. Scavando più a fondo sembra che occasionalmente se e solo se il file viene aperto da un altro utente e java sta cercando di sovrascrivere il file viene lanciata un'eccezione AccessDenied e il file viene eliminato.

Credo che questo deve essere un bug in setWritable() o Files.copy (o una combinazione) in quanto il file non deve essere cancellato in ogni caso e isWritable() restituisce true ogni volta. Ho provato altri metodi per impostare le autorizzazioni di sola lettura/UN-setting e sono uscito vuoto. L'attuale lavoro attorno a ciò che ho in atto cattura semplicemente l'eccezione e il loop finché il file non viene eliminato e una nuova copia è a posto. Funziona ma è davvero un hack quindi se qualcuno ha delle soluzioni/suggerimenti migliori, li accolgo.

+0

Quanto è grande il file? Potrebbe essere causato da una disconnessione della rete durante la copia del file? – Byron

+0

@Byron Questa era la mia unica teoria funzionante, ma ho eseguito test di connettività di rete per lunghi periodi senza ritardi – David

+0

@Byron Anche il file sarà grande alla fine ma attualmente è solo ~ 500k – David

risposta

-2

Vedi How does FileLock work?, si potrebbe fare qualcosa di simile:

  1. Attendere che il file diventi disponibile
  2. bloccare il file
  3. sovrascrittura/cancellazione/altra
  4. sblocco (se applicabile)

Questo dovrebbe impedire l'accesso da parte di altri utenti durante il processo di modifica del file.

+1

Se e solo se anche gli altri utenti utilizzano il blocco dei file. – EJP

+0

Suppongo che dipenda dall'implementazione del filesystem ma nei miei test locali, se blocco un file, a meno di rimuovere manualmente il blocco a livello di codice, non posso cancellare, scrivere o rinominare quel file mentre il blocco è aperto.Quindi non sono sicuro del motivo per cui sono stato downvoted qui! – Fallso

Problemi correlati