我们有一个用Java编写的计划任务在Windows平台上失败,因为有时它需要删除的文件仍在使用中。从Java中可以看出哪些进程正在使用文件并获取有关它们的信息?
我想我会补充一点,如果有必要,我愿意使用JNA或JNI,我认为它会是。
答案 0 :(得分:2)
您可以使用优秀的Sysinternals Process Explorer来执行此操作,并且不仅限于Java进程。
有关详细信息,请参阅this posting。但是,我不知道如何从java调用此功能。
答案 1 :(得分:2)
我在Github上为JNA项目提出了类似的问题, @matthiasblaesing 编写了一个代码来完成此任务。
代码为here。
它以以下格式打印包含所有正在运行的进程的列表:<exe>: <type>: <path>
。
答案 2 :(得分:1)
执行此操作的一种肮脏方法是使用管理权限运行应用程序,并使用Handle调用ProcessBuilder等命令实用程序。
答案 3 :(得分:0)
我自己的初步答案(拜托,有人做得更好!):
理想情况下,我想学习如何以编程方式执行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)如果我们可以提供帮助,我们当然不希望这样做。