2010-03-23 77 views
0

我遇到了一個很常見的問題,「該進程無法訪問該文件,因爲它正在被另一個進程使用。」C#如何判斷哪個進程正在使用文件?

現在我幾乎可以確定訪問此文件的唯一過程來自我寫的代碼,並且我一直在使用using語句來訪問它。

但是要100%確定,是否有無論如何檢查這個編程方式,當這種錯誤發生?

回答

4

Sysinternals Suite中還有一個小工具handle.exe,它完全符合您的需求。從命令行使用它:

handle.exe -a <filename> 

當然,在Vista和Windows 7下,此工具必須運行提升。

+0

當然,這不是一個「編程」檢查,它是一個單獨的命令行工具。但那些也可以自動化。 – 2010-03-23 23:15:23

0

例如資源工具包中的oh.exe和sysInternals中的進程資源管理器都顯示誰在使用什麼

他們兩人都使用C#中不可用的技術。

+2

在c#中不可用,即使是不安全的win32調用和interop? – 2010-03-23 04:13:38

+0

有幾件事情不能用C#完成(即使使用所提到的高級技術),其中包括驅動程序開發和DLL注入。然而,看起來獲取句柄列表在用戶模式API ZwQuerySystemInformation(SystemHandleInformation)中是可用的,它應該可以被p/invoke調用。它的進程監視器具有不能使用C#複製的功能。 – 2010-03-23 23:22:11

0

Windows Vista增加了一項新功能GetRunningObjectTable,您可以使用該功能來檢測哪個程序打開了一個文件。這隻適用於Vista +,並且只有在打開文件的應用程序實際支持IFileIsInUse(例如Office支持它,但大多數第三方應用程序可能不支持)時纔可用。

除此之外,這種實現的常用方法是打開每個進程,枚舉已打開的文件句柄並搜索文件名。這是相當低級的,並且需要相當多的P/Invoke才能在C#中實現,但這不是不可能的。

打開Process Explorer並讓它執行搜索通常很容易。

相關問題