使用FileSystemWatcher,我們可以監視特定文件系統的IO活動,但無論如何要知道哪個正在運行的進程正在引起該IO?如何使用C#監視進程的IO活動?
更具體地說,假設正在運行的過程, abc.exe正在驅動器D上創建一個文件text.txt。我們可以監視使用FileSystemWatcher在驅動器D中創建了一個名爲text.txt的文件,但是我們可以通過編程確定名爲abc.exe的進程正在創建該特定文件在驅動器D?
使用FileSystemWatcher,我們可以監視特定文件系統的IO活動,但無論如何要知道哪個正在運行的進程正在引起該IO?如何使用C#監視進程的IO活動?
更具體地說,假設正在運行的過程, abc.exe正在驅動器D上創建一個文件text.txt。我們可以監視使用FileSystemWatcher在驅動器D中創建了一個名爲text.txt的文件,但是我們可以通過編程確定名爲abc.exe的進程正在創建該特定文件在驅動器D?
來自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
雖然它不是一個API,但我仍然希望它能幫助我實現目標,但我選擇了您的答案作爲潛在答案。 – 2010-10-21 08:26:58
@Anindya Chatterjee,我同意一個實際的API會更好。不幸的是,該來源不再可用。 http://damieng.com/blog/2006/11/09/microsoft-withdraws-sysinternals-source-code – 2010-10-21 13:29:50
我會爲此推薦SysInternals公用程序,而不是滾動您自己的。
http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx
但是那些應用程序並不是API來「編程確定」用戶想知道的內容。 – 2010-10-19 18:10:11
@Sam - 參見Hans Passant的回答,解釋爲什麼這種做法不能輕易實現 – 2010-10-19 18:22:11
@Steve Townsend,這並沒有提及SysInternals的正確答案。 – 2010-10-19 18:28:16
不,這是不可能的。 FSW在文件系統驅動程序堆棧中處於非常低的級別。它只能告訴文件系統正在被修改,它不知道誰。這非常具有設計性,它可能是一個位於世界中途的過程,通過互聯網上的VPN連接使用文件共享。您的要求沒有合理的選擇。
不知你是否可以嘗試訪問該文件,然後捕獲該異常,因爲它會在被另一個進程使用,並提取任何有價值的數據出異常的? – 2010-10-19 17:53:14
@Aaron,你會得到一個通用的異常,它不包括關於哪個進程正在使用該文件的細節。此外,如果文件以共享訪問權限打開,則您可能根本不會收到異常。 – 2010-10-21 13:30:36