我们有一个使用Java编写的计划任务,在Windows平台上失败,因为有时需要删除的文件仍在使用中。 有没有办法从Java内部,我可以看到什么进程正在使用一个文件,并得到他们的信息?
我想我会补充说,如果有必要,我愿意使用JNA或JNI,并且我认为这将是。
您可以使用优秀的Sysinternals Process Explorer来执行此操作,而不仅限于Java进程。
看到这个帖子的细节。 但是我不知道如何从java中调用这个功能。
我在Github上为JNA项目问了一个类似的问题, @matthiasblaesing写了一个代码来完成这个任务。
代码在这里 。
它以格式打印一个包含所有正在运行的进程的列表: <exe>: <type>: <path>
。
一个肮脏的方法是使用管理权限运行你的应用程序,并使用ProcessBuilder调用一个命令实用程序,如Handle 。
我自己的初步答案(请,有人做得更好!):
理想情况下,我想学习如何以编程方式执行诸如Process Explorer,unlocker,handler等工具,然后使用JNA或类似方法从Java中调用该工具。 但是它看起来像涉及每个Windows版本都会改变的数据结构,所以听起来很脆弱。 涉及的系统调用看起来被命名为NtQuerySystemInformation。
看起来像我们正在处理的情况下,Windows Vista的首选方法是使用“重新启动管理器API”,这将触发系统重新启动,清除所有打开的文件句柄。 (来源: http : //social.msdn.microsoft.com/Forums/sv/netfxbcl/thread/37dc9843-2583-41fc-8260-b78183aa4bed )我们当然不希望这样做,如果我们可以帮助它。