當另一個應用程序關閉某個文件時,我需要生成一個事件。監視與系統內部/ Microsoft的FileMon /進程監視器類似的文件
不幸的是,ReadDirectoryChangesW不報告關閉事件。我有可能通過輪詢(使用TTimer)ReadDirectoryChangesW報告的任何文件被修改,等待它被關閉(使用CreateFile來檢測這個文件)。
但是,我更喜歡的是完全由事件驅動的解決方案。
有沒有辦法掛鉤系統調用並檢測所有文件關閉事件?我只是想知道剛剛關閉的任何文件的路徑&。
當另一個應用程序關閉某個文件時,我需要生成一個事件。監視與系統內部/ Microsoft的FileMon /進程監視器類似的文件
不幸的是,ReadDirectoryChangesW不報告關閉事件。我有可能通過輪詢(使用TTimer)ReadDirectoryChangesW報告的任何文件被修改,等待它被關閉(使用CreateFile來檢測這個文件)。
但是,我更喜歡的是完全由事件驅動的解決方案。
有沒有辦法掛鉤系統調用並檢測所有文件關閉事件?我只是想知道剛剛關閉的任何文件的路徑&。
在Delphi中沒有簡單的解決方案來解決您的問題 - 真正的解決方案是編寫一個filter driver來監視文件關閉事件。
你應該看看馬蒂亞斯Rauens madCodeHook:
madCodeHook提供您所需要 在從Windows 95的所有32個 位和64位Windows操作系統 掛鉤代碼(主要是API)來Windows 7的一切。您可以 選擇是否要在自己的進程中或在特定的目標進程或系統範圍內掛接API 。
內絕地武士代碼庫(JCL),您有一個名爲「TJvChangeNotify」,其中當已經在監測目錄被檢測到的變化,你可以得到通知組件:
其他的事情可以做:
最重要的是,這一個文件夾中搜索與子目錄,如果你要。 以下是此組件的(部分)幫助文件的鏈接: http://help.delphi-jedi.org/item.php?Id=172982
希望這會有所幫助。
如果更改通知無法工作,您可能會使用非常粗糙和蹩腳的方法:輪詢。每隔一秒左右,嘗試使用一些不兼容的共享選項打開文件。這一次成功的時候,你知道另一個應用程序已經關閉它。
不是迄今爲止最乾淨的選項,但它會起作用。如果您需要監視有限數量的文件並且它們的名稱事先已知,則這只是一個選項。
如果你選擇去過濾驅動的路線,Eldos有CallbackFilter組件:
你有什麼想法,爲什麼目錄更改對象不給你的事件?這通常應該在沒有任何本地和可移動驅動器(甚至在任何網絡驅動器上)的情況下工作。曾嘗試過更改通知例程:SHChangeNotifyRegister? –
他不想檢測正在關閉的文件句柄,而不是正在刪除的文件。 ReadDirectoryChangesW不提供該事件。 – Runner