2009-11-17 103 views
7

我需要編寫一個delphi程序來監視文件夾的變化(添加,更新,重命名和刪除文件)。 TShellChangeNotifier是否要走?說實話,我不知道如何使用它。使用Delphi跟蹤對文件夾所做的更改?

請幫忙。

謝謝。

+0

http://www.cromis.net/blog/downloads/directory-watch/非常優秀且免費的。 – Ampere 2017-06-16 19:19:48

回答

5

This question may help。 mghie的回答顯示如何正確使用ReadDirectoryChangesW

5

我認爲這篇文章將幫助您:Monitoring System Shell Changes using Delphi

基本上分析了TShellChangeNotifier,將其丟棄,然後進入一個TSHChangeNotify這基本上是爲SHChangeNotify Windows API函數的包裝。

+1

它似乎是監視整個文件系統,我只能將它限制爲監視本地硬盤。有沒有一種方法可以指定它將只監視的文件夾?我擔心它可能會吃掉很多不必要的資源。非常感謝。 – Snackmoore 2009-11-17 08:22:56

+0

我不認爲你可以,至少與SHChangeNotify。儘管如此,你不應該吃掉很多資源,你只會忽略任何不影響你感興趣的路徑,windows會監控你正在聽的所有變化:) – 2009-11-17 08:44:19

0

我建議使用madShell

RegisterShellEvent(ShellEvent, pathToMonitor, false, [seItemCreated, seItemRenamed]); 

// 

procedure Tform.ShellEvent(event: TShellEventType; const obj1, obj2: IShellObj; drive: char; value: cardinal); 
var 
    filename: string; 
    isReady: boolean; 
begin 
    if (event = seItemCreated) then 
    filename := obj1.Path 
    else if (event = seItemRenamed) then 
    filename := obj2.Path 
    else 
    exit; 

    // try to open to ensure it's read for reading 
    repeat 
    try 
     TfileStream.Create(filename, fmOpenRead + fmShareExclusive).Free; 
     isReady := true; 
    except 
     isReady := false; 
     sleep(250); 
    end; 
    until (isReady) or (not FileExists(filename)); 

    OutputDebugString(pChar('ShellEvent: ' + filename)); 

end; 
+1

我不會知道madShell,但'repeat'循環看起來非常難看。它不斷拋出和捕獲異常,並有一個硬編碼的延遲......不是我期望從一個乾淨而高效的解決方案中獲得的...... – jpfollenius 2009-11-17 12:34:25