2012-06-19 18 views
10

Tenemos una tarea programada escrita en Java que está fallando en las plataformas de Windows porque a veces los archivos que necesita eliminar todavía están en uso. ¿Hay alguna forma desde Java de que pueda ver qué procesos están usando un archivo y obtener información sobre ellos?¿Cómo puedo saber qué procesos están usando un archivo bajo Java en Windows?

Pensé en agregar que estoy dispuesto a usar JNA o JNI si es necesario, y supongo que va a ser así.

+3

No estoy seguro si podrá hacerlo sin depender del sistema operativo, lo que limita la portabilidad de su aplicación. – cklab

+4

Sí, esta va a ser una solución solo de Windows, pero es un problema exclusivo de Windows. La misma tarea automática ya funciona perfectamente bien en cientos de servidores Linux. Si lo resolvemos, no ejecutaremos el código para esta solución en Linux. – skiphoppy

Respuesta

2

Puede usar el excelente Sysinternals Process Explorer para hacer esto, y no está limitado a los procesos de Java.

Ver this posting para más detalles. Sin embargo, no sé cómo invocar esta funcionalidad desde java.

+0

¿Tiene información sobre la licencia? ¿Es de código abierto? –

+0

Tenemos explorador de procesos, pero necesito una forma de hacerlo mediante programación. – skiphoppy

1

Una manera sucia de hacerlo es ejecutar su aplicación con privilegios administrativos e invocar una utilidad de comando como Handle usando un ProcessBuilder.

+0

Eso podría ser lo mejor, ya que Handle y utilidades similares probablemente encapsulan todo el trabajo complicado de trabajar en diferentes versiones de Windows. – skiphoppy

0

Mi propia respuesta preliminar (por favor, que alguien haga mejor!):

Idealmente, me gustaría aprender a hacerlo mediante programación qué herramientas como Process Explorer, desbloqueador, manipulador, etc., hacer, y luego llama eso desde Java con JNA o similar. Pero parece que eso implica estructuras de datos que cambian para cada versión de Windows, por lo que suena muy frágil. La llamada al sistema implicada se denomina NtQuerySystemInformation.

Parece que, en casos como el que nos ocupa, el enfoque preferido para Windows Vista en adelante es utilizar la "API de reinicio del administrador", que desencadena un reinicio del sistema y borra todos los manejadores de archivos abiertos. (fuente: http://social.msdn.microsoft.com/Forums/sv/netfxbcl/thread/37dc9843-2583-41fc-8260-b78183aa4bed) Seguro que no queremos hacer eso, si podemos evitarlo.

+0

El propósito del administrador de reinicio es * evitar * un reinicio, no activar uno. –

+0

Gracias. Probablemente estoy malentendido, y lo volveré a leer. – skiphoppy

2

Hice una pregunta similar sobre Github para el proyecto JNA y @matthiasblaesing escribió un código para lograr esto.

El código es here.

Imprime una lista con todos los procesos en ejecución en el formato: <exe>: <type>: <path>.

Cuestiones relacionadas