11

我们有一个用 Java 编写的计划任务在 Windows 平台上失败,因为有时它需要删除的文件仍在使用中。有没有办法从 Java 中查看哪些进程正在使用文件并获取有关它们的信息?

我想我会补充一点,如果有必要,我愿意使用 JNA 或 JNI,而且我认为它会是。

4

4 回答 4

3

我在 Github 上为 JNA 项目提出了一个类似的问题,@matthiasblaesing编写了一个代码来完成这个问题。

代码在这里

它以以下格式打印包含所有正在运行的进程的列表:<exe>: <type>: <path>.

于 2016-08-27T22:14:10.727 回答
2

一种肮脏的方法是使用管理权限运行您的应用程序,并使用ProcessBuilder调用命令实用程序,例如Handle

于 2012-06-19T16:53:21.813 回答
1

我自己的初步答案(请有人做得更好!):

理想情况下,我想学习如何以编程方式执行 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 )如果我们能提供帮助,我们当然不想这样做。

于 2012-06-19T17:03:35.613 回答
1

您可以使用出色的Sysinternals Process Explorer来执行此操作,并且不仅限于 Java 进程。

有关详细信息,请参阅此帖子。但是,我不知道如何从 java 调用此功能。

于 2012-06-19T16:10:08.900 回答