2009-11-17 25 views
7

Ich muss ein Delphi-Programm schreiben, das einen Ordner auf Änderungen überwacht (Hinzufügen, Aktualisieren, Umbenennen und Entfernen von Dateien). Ist der TShellChangeNotifier weit weg? Um ehrlich zu sein, ich habe keine Ahnung, wie man es benutzt.Verwenden von Delphi, um Änderungen an Ordner zu verfolgen?

Bitte helfen.

Danke.

+0

http://www.cromis.net/blog/downloads/directory-watch/ sehr gut und frei verwenden. – Ampere

Antwort

5

Diese question könnte helfen. mghies Antwort zeigt, wie man ReadDirectoryChangesW richtig benutzt.

5

Ich denke, dieser Artikel wird Ihnen helfen: Monitoring System Shell Changes using Delphi

Im Grunde ist es die TShellChangeNotifier analysiert, verwirft sie und geht dann für eine TSHChangeNotify, die für die SHChangeNotify Windows API Funktion im Grunde ein Wrapper ist.

+1

Es scheint, das gesamte Dateisystem zu überwachen, ich kann es nur beschränken, lokale Festplatten zu überwachen. Gibt es eine Möglichkeit, den Ordner anzugeben, der nur überwacht wird? Ich bin besorgt, es könnte viele unnötige Ressourcen verbrauchen. Danke vielmals. – Snackmoore

+0

Ich glaube nicht, dass Sie, zumindest mit dem SHChangeNotify. Nichtsdestoweniger sollte nicht viele Ressourcen auffressen, Sie werden einfach ignorieren, was nicht den Pfad beeinflusst, an dem Sie interessiert sind, Windows wird alle Änderungen überwachen, ob Sie hören oder nicht :) –

0

Ich schlage vor, 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

Ich nicht weiß madShell, aber diese "Wiederholungsschleife" sieht sehr hässlich aus. Es wirft und fängt fortwährend Ausnahmen und hat eine hart codierte Verzögerung ... nicht was ich von einer sauberen und effizienten Lösung erwarte ... – jpfollenius

Verwandte Themen