Soyez le premier à donner votre avis sur cette source.
Vue 13 009 fois - Téléchargée 1 062 fois
procedure TThreadMonit.Execute; var dwStatus: DWORD; //status renvoyé par WaitForMultipleObjects hChangeHwnd: PWOHandleArray; //array d'handle a passer a WaitForMultipleObjects MonitPath: PChar; //l'emplacement du répertoire begin with Form1 do begin MonitPath := PChar(edtPath.Text); //on cast la string edtPath.Text dans notre pchar MonitPath while not Terminated do //tant que le thread tourne begin hChangeHwnd[0] := FindFirstChangeNotification(MonitPath, True, //on veut être notifié des changements de nom de fichier FILE_NOTIFY_CHANGE_FILE_NAME);//MonitPath: le dossier à surveiller, True: Si on veut surveiller les sous-dossiers, FILE_NOTIFY_*: type d'action à surveiller if hChangeHwnd[0] = INVALID_HANDLE_VALUE then //si le 1º élément du tableau hChangeHwnd est un handle invalide alors on stop tout begin ShowMessage(SysErrorMessage(GetLastError)); //on affiche un dialog avec la description de l'erreur, en récuperant son erreur via GetLastError Exit; end; hChangeHwnd[1] := FindFirstChangeNotification(MonitPath, True, //on veut être notifié des changements de nom de dossier FILE_NOTIFY_CHANGE_DIR_NAME); if hChangeHwnd[1] = INVALID_HANDLE_VALUE then begin ShowMessage(SysErrorMessage(GetLastError)); Exit; end; hChangeHwnd[2] := FindFirstChangeNotification(MonitPath, True, //on veut être notifié des changements de date de dernier accès au fichier FILE_NOTIFY_CHANGE_LAST_ACCESS); if hChangeHwnd[2] = INVALID_HANDLE_VALUE then begin ShowMessage(SysErrorMessage(GetLastError)); Exit; end; while True do //loop infinie begin dwStatus := WaitForMultipleObjects(3, hChangeHwnd, FALSE, INFINITE); //Etat d'attente sur notre tableau d'handle qui est de 3 éléments, FALSE= on est alerté quand l'un des handles est apellé (TRUE= on est alerté quand tous sont apellés) case dwStatus of WAIT_OBJECT_0: //1er élément du tableau est apellé (1er handle) begin Form1.ListBox1.Items.Add('Changement détecté : ' + ' Action fichier'); if not FindNextChangeNotification(hChangeHwnd[0]) then //on veut être notifié du prochain changement, si cette demande échou on sort de la boucle pour que les handles soient libérés et le thread terminé begin ShowMessage(SysErrorMessage(GetLastError)); break; end else continue; end; //obj WAIT_OBJECT_0 + 1: //2º élément du tableau est apellé (2ème handle) begin Form1.ListBox1.Items.Add('Changement détecté : ' + ' Action dossier'); if not FindNextChangeNotification(hChangeHwnd[1]) then begin ShowMessage(SysErrorMessage(GetLastError)); break; end else continue; end; //obj+1 WAIT_OBJECT_0 + 2: //3º élément du tableau est apellé (3ème handle) begin Form1.ListBox1.Items.Add('Changement détecté : ' + ' Fichier accédé'); //saffiche aussi quand l'on crée un dossier vu que le dossier est accéder lors de sa création if not FindNextChangeNotification(hChangeHwnd[2]) then begin ShowMessage(SysErrorMessage(GetLastError)); break; end else continue; end; //obj+2 else continue; end; //case end; //while FindCloseChangeNotification(hChangeHwnd[0]); //on libère nos handles de notifications FindCloseChangeNotification(hChangeHwnd[1]); FindCloseChangeNotification(hChangeHwnd[2]); Terminate; //on termine notre thread end;//while not terminated end; //with end;
12 juil. 2005 à 23:27
http://nono40.developpez.com/sources/source0045/
( fonctionne sous NT 2000 XP mais pas 95 98 ME )
Sur tous les systèmes et en utilisant la fonction donnée ci-dessus, j'avais fais ceci il y a un moment :
http://nono40.developpez.com/sources/source0017/
On se sert de la date/heure de modification pour trouver lequel des fichiers à été modifié. Ce n'est pas aussi fiable que la méthode donnée en premier.
9 juil. 2005 à 11:21
Y aurait-il un moyen de récupérer le nom du fichier qui a été accédé ?
Sinon, Excellent travail mais je n'aime pas trop ton histoire de boucle infinie. Il doit y avoir unmoyen de s'en passer.
Flo
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.