2009-11-17 12 views
7

Potrzebuję napisać program delphi, który będzie monitorował folder pod kątem zmian (dodawanie, aktualizowanie, zmiana nazwy i usuwanie plików). Czy TShellChangeNotifier jest do zrobienia? Szczerze mówiąc, nie mam pojęcia, jak z niego korzystać.Używanie Delphi do śledzenia zmian dokonanych w folderze?

Proszę o pomoc.

Dzięki.

+0

http://www.cromis.net/blog/downloads/directory-watch/ jest bardzo dobre i za darmo. – Ampere

Odpowiedz

5

Ten question może pomóc. Odpowiedź mghie pokazuje, jak prawidłowo używać ReadDirectoryChangesW.

5

Myślę, że ten artykuł pomoże Ci: Monitoring System Shell Changes using Delphi

Zasadniczo analizuje TShellChangeNotifier, odrzuca go, a następnie idzie na TSHChangeNotify który jest po prostu otoki dla funkcji API SHChangeNotify Windows.

+1

Wygląda na to, że monitoruje cały system plików, mogę go ograniczyć tylko do monitorowania lokalnych dysków twardych. Czy istnieje sposób, w jaki mogę określić folder, który będzie monitorować? Obawiam się, że może zjadać mnóstwo niepotrzebnych zasobów. Wielkie dzięki. – Snackmoore

+0

Nie sądzę, że można, przynajmniej z SHChangeNotify. Niemniej jednak nie powinno się jeść dużo zasobów, po prostu zignorujesz to, co nie wpływa na ścieżkę, którą cię interesuje, okna będą monitorować wszystkie zmiany, których słuchasz, czy nie :) –

0

Proponuję za pomocą 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

Ja nie znać madShell, ale pętla 'repeat' wygląda bardzo brzydko. Ciągle wyrzuca i łapie wyjątki i ma sztywne opóźnienie ... nie to, czego oczekuję od czystego i wydajnego rozwiązania ... – jpfollenius

Powiązane problemy