2009-11-17 8 views
7

J'ai besoin d'écrire un programme Delphi qui va surveiller un dossier pour les changements (Ajouter, mettre à jour, renommer et supprimer des fichiers). Est-ce que le TShellChangeNotifier est prêt? Pour être honnête, je n'ai aucune idée de comment l'utiliser.Utiliser Delphi pour suivre les modifications apportées au dossier?

Aidez-nous s'il vous plaît.

Merci.

+0

http://www.cromis.net/blog/downloads/directory-watch/ est très bon et gratuit. – Ampere

Répondre

5

Cette question peut aider. La réponse de Mghie montre comment utiliser correctement ReadDirectoryChangesW.

5

Je pense que cet article vous aidera à: Monitoring System Shell Changes using Delphi

Fondamentalement, il analyse les TShellChangeNotifier, les rejets et puis il va pour une TSHChangeNotify qui est essentiellement une enveloppe pour la SHChangeNotify fenêtres fonction api.

+1

Il semble être surveiller l'ensemble du système de fichiers, je ne peux que le limiter pour surveiller les disques durs locaux. Existe-t-il un moyen de spécifier le dossier qu'il surveillera uniquement? Je crains que cela pourrait consommer beaucoup de ressources inutiles. Merci beaucoup. – Snackmoore

+0

Je ne pense pas que vous le pouvez, au moins avec le SHChangeNotify. Néanmoins, ne devrait pas manger beaucoup de ressources, vous ignorez tout ce qui n'affecte pas le chemin qui vous intéresse, Windows surveillera tous les changements que vous écoutez ou non :) –

0

Je suggère d'utiliser 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

Je ne sais pas savoir madShell mais cette boucle 'repeat' semble très moche. Il jette et attrape continuellement des exceptions et a un délai codé en dur ... pas ce que j'attends d'une solution propre et efficace ... – jpfollenius

Questions connexes