2010-03-27 114 views
5

當另一個應用程序關閉某個文件時,我需要生成一個事件。監視與系統內部/ Microsoft的FileMon /進程監視器類似的文件

不幸的是,ReadDirectoryChangesW不報告關閉事件。我有可能通過輪詢(使用TTimer)ReadDirectoryChangesW報告的任何文件被修改,等待它被關閉(使用CreateFile來檢測這個文件)。

但是,我更喜歡的是完全由事件驅動的解決方案。

有沒有辦法掛鉤系統調用並檢測所有文件關閉事件?我只是想知道剛剛關閉的任何文件的路徑&。

+1

你有什麼想法,爲什麼目錄更改對象不給你的事件?這通常應該在沒有任何本地和可移動驅動器(甚至在任何網絡驅動器上)的情況下工作。曾嘗試過更改通知例程:SHChangeNotifyRegister? –

+1

他不想檢測正在關閉的文件句柄,而不是正在刪除的文件。 ReadDirectoryChangesW不提供該事件。 – Runner

回答

7

在Delphi中沒有簡單的解決方案來解決您的問題 - 真正的解決方案是編寫一個filter driver來監視文件關閉事件。

5

你應該看看馬蒂亞斯Rauens madCodeHook

madCodeHook提供您所需要 在從Windows 95的所有32個 位和64位Windows操作系統 掛鉤代碼(主要是API)來Windows 7的一切。您可以 選擇是否要在自己的進程中或在特定的目標進程或系統範圍內掛接API 。

-1

絕地武士代碼庫(JCL),您有一個名爲「TJvChangeNotify」,其中當已經在監測目錄被檢測到的變化,你可以得到通知組件:

  • 改爲「最後寫' =>所以這似乎是你想要做的確切的事情!

其他的事情可以做:

  • 更改後的文件大小
  • 更改文件名 ...

最重要的是,這一個文件夾中搜索與子目錄,如果你要。 以下是此組件的(部分)幫助文件的鏈接: http://help.delphi-jedi.org/item.php?Id=172982

希望這會有所幫助。

+0

這個問題具體提到了爲什麼這不是OP之後的事情。 – mghie

+0

-1:明確表示這不是一個選項。 –

+0

不需要那麼粗糙。這個問題完成後,我只想知道任何剛剛關閉的文件的路徑和名稱,所以我試着回覆:) – TridenT

0

如果更改通知無法工作,您可能會使用非常粗糙和蹩腳的方法:輪詢。每隔一秒左右,嘗試使用一些不兼容的共享選項打開文件。這一次成功的時候,你知道另一個應用程序已經關閉它。

不是迄今爲止最乾淨的選項,但它會起作用。如果您需要監視有限數量的文件並且它們的名稱事先已知,則這只是一個選項。

+0

在問題中提到這是一個可能的(蹩腳的)解決方案,那麼爲什麼要重複呢? – mghie

+1

我剛纔說的很明顯,但我認爲親們的缺點和不可否認性沒有被提及。這就是爲什麼。 –

+0

你沒有提到任何不可能性。可以通過這種方式監視無限數量的文件,這些文件的名字不需要事先知道,而且OP在他的問題中也這樣說。你沒有提到真正的限制,也就是說這可能會干擾其他程序(它可能導致他們重新打開被監視的文件失敗)。 – mghie