2012-06-19 5 views
10

Abbiamo un'attività pianificata scritta in Java che non funziona su piattaforme Windows perché a volte i file che deve eliminare sono ancora in uso. C'è un modo dentro Java per vedere quali processi stanno usando un file e ottenere informazioni su di essi?Come posso sapere quali processi stanno utilizzando un file sotto Java in Windows?

Ho pensato di aggiungere che sono disposto a utilizzare JNA o JNI se necessario, e presumo che lo sarà.

+3

Non è sicuro se sarà possibile farlo senza diventare dipendenti dal sistema operativo, limitando così la portabilità della propria applicazione. – cklab

+4

Sì, questa sarà una soluzione solo per Windows, ma è un problema di Windows. Lo stesso compito automatico funziona già perfettamente su centinaia di server Linux. Se lo individuiamo, non eseguiremo il codice per questa soluzione su Linux. – skiphoppy

risposta

2

È possibile utilizzare l'eccellente Sysinternals Process Explorer per eseguire questa operazione e non è limitato ai processi Java.

Vedere this posting per dettagli. Non so come richiamare questa funzionalità da java, comunque.

+0

Hai informazioni sulla licenza? È open source? –

+0

Abbiamo Process Explorer, ma ho bisogno di un modo per farlo a livello di programmazione. – skiphoppy

1

Un modo per farlo è quello di eseguire l'applicazione con privilegi amministrativi e richiamare un'utilità di comando come Handle utilizzando un ProcessBuilder.

+0

Questo potrebbe essere il migliore, poiché Handle e utility simili probabilmente incapsulano tutto il complicato lavoro di lavoro su diverse versioni di Windows. – skiphoppy

0

La mia risposta preliminare (per favore, qualcuno fare meglio!):

Idealmente, mi piacerebbe imparare a fare di programmazione quali strumenti come Process Explorer, unlocker, gestore, ecc, fare, e poi chiamalo da Java con JNA o simili. Ma sembra che coinvolga strutture dati che cambiano per ogni versione di Windows, quindi sembra molto fragile. La chiamata di sistema in questione sembra essere denominata NtQuerySystemInformation.

Sembra che in casi come quello di cui ci stiamo occupando, l'approccio preferito per Windows Vista è quello di utilizzare la "API del gestore di riavvio", che attiva il riavvio del sistema, cancellando tutti i filehandle aperti. (fonte: http://social.msdn.microsoft.com/Forums/sv/netfxbcl/thread/37dc9843-2583-41fc-8260-b78183aa4bed) Di sicuro non vogliamo farlo, se possiamo aiutarlo.

+0

Lo scopo del Gestore riavvio è quello di * evitare * un riavvio, non di attivarne uno. –

+0

Grazie. Probabilmente sto fraintendendo e lo rileggerò. – skiphoppy

2

Ho fatto una domanda simile su Github per il progetto JNA e @matthiasblaesing ha scritto un codice per realizzare questo.

Il codice è here.

Stampa un elenco con tutti i processi in esecuzione nel formato: <exe>: <type>: <path>.

Problemi correlati