Как я могу определить, какие процессы используют файл под Java в Windows?

У нас есть запланированная задача, написанная на Java, которая терпит неудачу на платформах Windows, потому что иногда файлы, которые необходимо удалить, все еще используются. Есть ли способ изнутри Java, чтобы я мог видеть, какие процессы используют файл и получать информацию о них?

Я думал, что добавлю, что я готов использовать JNA или JNI, если это необходимо, и я предполагаю, что это будет.

Ответ 1

Для этого вы можете использовать отличный Sysinternals Process Explorer и не ограничиваться Java-процессами.

Подробнее см. эту публикацию. Однако я не знаю, как вызывать эту функцию из java.

Ответ 2

Я задал аналогичный вопрос о Github для проекта JNA, а @matthiasblaesing написал код для этого.

Код здесь.

Он печатает список со всеми запущенными процессами в формате: <exe>: <type>: <path>.

Ответ 3

Один грязный способ сделать это - запустить приложение с правами администратора и вызвать служебную программу, например Обработать, используя ProcessBuilder.

Ответ 4

Мой собственный предварительный ответ (пожалуйста, кто-то лучше!):

В идеале я хотел бы узнать, как программно делать какие-то инструменты, такие как Process Explorer, unlocker, handler и т.д., и затем вызывать это из Java с помощью JNA или аналогичного. Но похоже, что это касается структур данных, которые меняются для каждой версии Windows, поэтому она звучит очень хрупкой. Системный вызов, по-видимому, называется NtQuerySystemInformation.

Похоже, что в таких случаях, как мы имеем дело, предпочтительным подходом для Windows Vista является использование "API диспетчера перезапуска", который запускает перезапуск системы, очищая все открытые дескрипторы файлов. (источник: http://social.msdn.microsoft.com/Forums/sv/netfxbcl/thread/37dc9843-2583-41fc-8260-b78183aa4bed) Мы не хотим этого делать, если можем помочь.