2010-03-19 84 views
10

在.Net中有一種方法可以準確找出哪個進程已鎖定文件?文件被哪個進程鎖定?

編輯:我這樣做是因爲我想讓我的用戶知道他們不能修改/打開該文件,因爲此刻,他們正在使用(如Excel),另一個程序有它打開。希望這會有所幫助。

+1

這些信息將是無用的,因爲當你對它做某些事情時,它可能不再準確。 – 2010-03-19 18:45:29

+7

真的喬希?你確定... – SpaceghostAli 2010-03-19 18:50:01

+0

@SpaceghostAli文件總是無限期地鎖定,不是嗎? – 2010-03-19 18:56:48

回答

6

對此的簡短回答是否定的。

但是,長時間的答案是,您可以使用各種AP​​I調用和WMI方法來查找此信息,但不要指望它快速簡單。

如果要使用API​​調用,請使用SYSTEM_PROCESS_INFORMATION參數查看NtQuerySystemInformation函數。這是自帶的精彩免責聲明那些可愛的「無證」的方法之一:

NtQuerySystemInformation可 改變或在未來 版本的Windows中不可用。應用程序 應使用本主題中列出的備用功能 。

所以我建議避免使用WMI。

您可以使用WMI Win32_Process類來枚舉當前在機器上運行的所有進程,然後枚舉每個進程持有的所有句柄,直到找到您正在查找的文件。不幸的是,沒有簡單的方法去「嘿,哪個進程鎖定這個文件」,它只能用相反的方法搜索進程列表,直到找到鎖定您感興趣的文件的那個。

我建議在CodeProject上標題爲How To: (Almost) Everything In WMI via C# Part 2: Processes的漂亮的小文章。 (如果你喜歡那種東西,第1部分也是一個很好的閱讀)

0

貌似有人想出這一個(你可以學習一些法文以及:))

http://www.axcis.com.au/bb/viewtopic.php?p=505

+0

這是按進程激活的文件。他正在尋找反之亦然。 – 2010-03-19 18:48:49

+0

正確 - 如果它不是關鍵性能,則可以枚舉查找該文件的所有進程的輸出。 – holtavolt 2010-03-19 19:00:40

+0

當我爲Novell服務器實現此類功能時,我不得不這樣做 - 搜索查找文件的所有內容。 – 2010-03-19 19:07:05

1

嗯......這不正是這樣做的.NET的方式...但假設您只想使用簡單的實用程序查找,請查看Handle from SysInternals

+2

我認爲歐文在詢問如何編程,我不認爲這對他有幫助。 – 2010-03-19 19:05:12

+0

@Simon在技術上,他可以捕獲異常,然後以編程方式調用該命令行工具來獲取當前使用該文件的進程。遠非理想,是的,但可能! – 2010-03-19 19:14:10