我們有一個使用Java編寫的在Windows平臺上失敗的計劃任務,因爲有時需要刪除的文件仍在使用中。有沒有從Java內部的方式,我可以看到哪些進程正在使用一個文件,並獲得他們的信息?如何判斷哪些進程在Windows下使用Java下的文件?
我想我會補充一點,如果有必要,我願意使用JNA或JNI,並且我認爲它將會是。
我們有一個使用Java編寫的在Windows平臺上失敗的計劃任務,因爲有時需要刪除的文件仍在使用中。有沒有從Java內部的方式,我可以看到哪些進程正在使用一個文件,並獲得他們的信息?如何判斷哪些進程在Windows下使用Java下的文件?
我想我會補充一點,如果有必要,我願意使用JNA或JNI,並且我認爲它將會是。
您可以使用優秀的Sysinternals Process Explorer來做到這一點,它不僅限於Java進程。
有關詳細信息,請參閱this posting。但是,我不知道如何從java調用這個功能。
你有關於許可證的信息嗎?它是開源的嗎? –
我們有進程資源管理器,但我需要一種以編程方式執行此操作的方式。 – skiphoppy
這樣做的一個骯髒的方法是使用管理權限運行您的應用程序並使用ProcessBuilder調用命令實用程序,如Handle。
這可能是最好的,因爲Handle和類似的工具可能封裝了所有在不同Windows版本上工作的複雜工作。 – skiphoppy
我自己初步的答案(請別人做的更好!):
理想情況下,我想學習如何編程做什麼工具,如的Process Explorer,解鎖,處理程序等,這樣做,然後用JNA或類似的方法從Java中調用它。但它看起來像涉及每個Windows版本都會更改的數據結構,因此聽起來非常脆弱。涉及的系統調用看起來被命名爲NtQuerySystemInformation。
看起來就像我們正在處理的情況一樣,Windows Vista之後的首選方法是使用「重新啓動管理器API」,它會觸發系統重新啓動,清除所有打開的文件句柄。 (來源:http://social.msdn.microsoft.com/Forums/sv/netfxbcl/thread/37dc9843-2583-41fc-8260-b78183aa4bed)如果我們能夠提供幫助,我們確實不想那麼做。
重新啓動管理器的目的是*避免*重新啓動,而不是觸發一個。 –
謝謝。我可能會誤解,我會重讀它。 – skiphoppy
我在Github上爲JNA項目問了一個類似的問題,並且@matthiasblaesing寫了一個代碼來完成這個。
該代碼是here。
它以格式:<exe>: <type>: <path>
的格式輸出所有正在運行的進程的列表。
不確定您是否可以在不依賴操作系統的情況下執行此操作,從而限制應用程序的可移植性。 – cklab
是的,這將是一個僅限於Windows的解決方案,但它只是一個Windows問題。同樣的自動任務已經在數百臺Linux服務器上運行得非常好。如果我們弄明白了,我們將不會在Linux上執行此解決方案的代碼。 – skiphoppy