2012-06-22 21 views
9

Mi stavo chiedendo se fosse possibile eliminare una directory quando l'applicazione è stata chiusa?Eliminazione di una directory all'uscita in Java

C'è un modo semplice per fare qualcosa quando l'applicazione è chiusa?

Attualmente la mia app scarica i file di classe in fase di esecuzione, quindi quello che sto cercando è qualcosa che li rimuova dal sistema client.

ho provato finora

File directory = new File("macros/bin/"); 
directory.deleteOnExit(); 

Così come una cancellazione tempo di esecuzione dei file di avvio scaricati (che ovviamente non può essere fatto visto che ha bisogno di loro per eseguire).

+0

Se questi file di classe sono caricati in JVM, MS Windows probabilmente non ti consente di eliminarli. –

risposta

19

Si potrebbe provare questo:

Runtime.getRuntime().addShutdownHook(new Thread() { 

     @Override 
     public void run() { 
     /* Delete your file here. */ 
     } 
}); 

Molto dipende da come il programma sta finendo.

+1

sulla maggior parte dei sistemi, l'hook di arresto viene eseguito su ogni istanza, ma 'kill -9' che è il comportamento previsto. –

+0

grazie che ha funzionato a meraviglia – Arrin

+0

Probabilmente dovresti contribuire ad Apache commons-io poiché ritengo che la tua implementazione rispecchi meglio i bisogni effettivi. L'attuale implementazione di commons-io consiste nel registrare i file che si trovano nella directory al momento della chiamata piuttosto che alla fine, una volta completata l'elaborazione. –

8

Solo per la cronaca, la javadoc dice che directory.deleteOnExit() dovrebbe funzionare ... il metodo presumibilmente funziona per le directory. Tuttavia, l'approccio è probabilmente fallito perché la directory non è vuota nel momento in cui tenta di cancellarla ... e il sistema operativo in genere non ti consente di eliminare una directory non vuota.

La soluzione sarebbe chiamare deleteOnExit() per i file scaricati dall'utente. Devi fare questo dopo la chiamata directory.deleteOnExit(). Vedi il javadoc per il perché.

Detto questo, l'hook di arresto esplicito è un approccio più robusto.

3

si dovrebbe fare quanto segue usando Apache Commons IO:

Runtime.getRuntime().addShutdownHook(new Thread(() -> FileUtils.deleteQuietly(fileOrDir))); 

Nota: l'implementazione FileUtils.forceDeleteOnExit è difettoso: registra file per l'eliminazione durante la registrazione della directory, quindi se i file sono aggiunti in seguito lo farà non riescono a cancellare la directory.

0

È possibile utilizzare questo: org.apache.commons.io.FileUtils.forceDeleteOnExit(File)

/* 
* Schedules a file to be deleted when JVM exits. 
* If file is directory delete it and all sub-directories. 
*/ 
FileUtils.forceDeleteOnExit(File) 

Limitazione:
Purtroppo questo funziona solo se nessun file e/o cartelle aggiuntive si creano all'interno della directory dopo forceDeleteOnExit è stato chiamato.

Problemi correlati