2012-06-22 14 views
9

Me preguntaba si era posible eliminar un directorio cuando se cerró la aplicación.Eliminar un directorio al salir en Java

¿Hay alguna manera fácil de hacer algo cuando la aplicación está cerrada?

Actualmente mi aplicación descarga los archivos de clase en tiempo de ejecución, por lo que lo que realmente estoy buscando es algo para eliminarlos del sistema de clientes.

que he probado hasta ahora

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

Así como un eliminar el tiempo de ejecución de los archivos de inicio cargados (que obviamente no se pueden hacer ya que los necesita para funcionar).

+0

Si estos archivos de clase se cargan en JVM, entonces MS Windows probablemente no permita que los borre –

Respuesta

19

Usted podría intentar esto:

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

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

Mucho depende de cómo el programa se termina.

+1

en la mayoría de los sistemas el shutdown hook se ejecuta en cada instancia pero 'kill -9', que es el comportamiento esperado. –

+0

gracias que funcionó bien – Arrin

+0

Probablemente deberías contribuir a Apache commons-io ya que creo que tu implementación refleja mejor las necesidades reales. La implementación actual de commons-io es registrar los archivos que están en el directorio al momento de la llamada en lugar de al final una vez que se completa todo el procesamiento. –

8

Solo para el registro, el javadoc dice que directory.deleteOnExit() debería funcionar ... el método supuestamente funciona para directorios. Sin embargo, es probable que el enfoque falle porque el directorio no está vacío en el momento en que intenta eliminarlo ... y el sistema operativo por lo general no le permitirá eliminar un directorio no vacío.

La solución sería llamar al deleteOnExit() para los archivos que el usuario también descarga. Tiene que hacer esto después de la llamada directory.deleteOnExit(). Vea el javadoc por qué.

Habiendo dicho eso, el gancho de cierre explícito es un enfoque más robusto.

3

que debe hacer lo siguiente usando Apache Commons IO:

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

Nota: la implementación FileUtils.forceDeleteOnExit es defectuoso: registra archivos para ser eliminados durante el registro del directorio, por lo tanto si los archivos se añaden más tarde lo hará no puede eliminar el directorio.

0

Puede utilizar esta: 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) 

Limitación:
Desafortunadamente esto sólo funciona si no hay archivos y/o carpetas adicionales se crean dentro del directorio después forceDeleteOnExit se llamaba.

Cuestiones relacionadas