2010-10-19 43 views
4

使用FileSystemWatcher,我們可以監視特定文件系統的IO活動,但無論如何要知道哪個正在運行的進程正在引起該IO?如何使用C#監視進程的IO活動?

更具體地說,假設正在運行的過程, abc.exe正在驅動器D上創建一個文件text.txt。我們可以監視使用FileSystemWatcher在驅動器D中創建了一個名爲text.txt的文件,但是我們可以通過編程確定名爲abc.exe的進程正在創建該特定文件在驅動器D?

+0

不知你是否可以嘗試訪問該文件,然後捕獲該異常,因爲它會在被另一個進程使用,並提取任何有價值的數據出異常的? – 2010-10-19 17:53:14

+0

@Aaron,你會得到一個通用的異常,它不包括關於哪個進程正在使用該文件的細節。此外,如果文件以共享訪問權限打開,則您可能根本不會收到異常。 – 2010-10-21 13:30:36

回答

6

來自SysInternals的handle.exe是一個命令行工具,它允許程序訪問哪個程序打開了特定的文件或目錄。

C:\>handle.exe c:\Windows\system32\stdole2.tlb 

產生這樣的輸出:

Handle v3.42 
Copyright (C) 1997-2008 Mark Russinovich 
Sysinternals - www.sysinternals.com 
devenv.exe   pid: 5240 184: C:\Windows\System32\stdole2.tlb 
Ssms.exe   pid: 5000 1F4: C:\Windows\System32\stdole2.tlb 

這可通過編程方式解析。

http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx

+0

雖然它不是一個API,但我仍然希望它能幫助我實現目標,但我選擇了您的答案作爲潛在答案。 – 2010-10-21 08:26:58

+0

@Anindya Chatterjee,我同意一個實際的API會更好。不幸的是,該來源不再可用。 http://damieng.com/blog/2006/11/09/microsoft-withdraws-sysinternals-source-code – 2010-10-21 13:29:50

0

我會爲此推薦SysInternals公用程序,而不是滾動您自己的。

http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx

+0

但是那些應用程序並不是API來「編程確定」用戶想知道的內容。 – 2010-10-19 18:10:11

+0

@Sam - 參見Hans Passant的回答,解釋爲什麼這種做法不能輕易實現 – 2010-10-19 18:22:11

+0

@Steve Townsend,這並沒有提及SysInternals的正確答案。 – 2010-10-19 18:28:16

1

不,這是不可能的。 FSW在文件系統驅動程序堆棧中處於非常低的級別。它只能告訴文件系統正在被修改,它不知道誰。這非常具有設計性,它可能是一個位於世界中途的過程,通過互聯網上的VPN連接使用文件共享。您的要求沒有合理的選擇。