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

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

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

 skiphoppy19 июн. 2012 г., 18:14
Да, это будет решение только для Windows, но это проблема только для Windows. Эта же автоматическая задача уже отлично работает на сотнях серверов Linux. Если мы это выясним, мы не будем выполнять код для этого решения в Linux.
 cklab19 июн. 2012 г., 18:09
Не уверен, сможете ли вы сделать это, не становясь зависимыми от ОС, что ограничит переносимость вашего приложения.

Ответы на вопрос(4)

Sysinternals Process Explorer чтобы сделать это, и это не ограничивается процессами Java.

Увидетьэта публикация для деталей. Однако я не знаю, как вызвать эту функцию из Java.

 19 июн. 2012 г., 18:12
У вас есть информация о лицензии? Это с открытым исходным кодом?
 skiphoppy19 июн. 2012 г., 18:13
У нас есть проводник процессов, но мне нужен способ сделать это программно.

администратора и вызвать утилиту командной строки, такую какСправиться используяProcessBuilder.

 skiphoppy19 июн. 2012 г., 20:35
Это может быть лучше, так как Handle и подобные утилиты, вероятно, инкапсулируют всю сложную работу по работе с различными версиями Windows.

кто-нибудь, сделайте лучше!):

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

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

 19 июн. 2012 г., 22:42
Назначение менеджера перезапуска состоит вavoid перезапуск, а не запускать один.
 skiphoppy20 июн. 2012 г., 15:46
Благодарю. Я, вероятно, недоразумение, и я буду перечитывать его.

@matthiasblaesing написал код для достижения этой цели.

Кодhere.

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

Ваш ответ на вопрос