Ceci est une ancienne révision du document !
Surveiller modification Fichier/Répertoire
Pistes de recherches
FindFirstChangeNotification
Cette méthode est documentée ici → Obtention de notifications de modification de répertoire
Apparemment cette méthode permet de savoir si un dossier a été modifier, mais pas de connaitre les modification apportées. Quel fichier modifié ? Quel fichier ajouté ou supprimé ?
Comment ça marche ?
Pour faire simple :
On récupere les Handle des répértoires a surveiller avec FindFirstChangeNotification
function FindFirstChangeNotification(lpPathName:LPCSTR; bWatchSubtree:WINBOOL; dwNotifyFilter:DWORD):HANDLE;
lpPathname
= PChar('C:\MonRepertoire\Etc\')bWatchSubtree
= boolean → on surveille juste le répertoire (False) ou le répertoire et ses enfants ? (True)dwNotifyFilter
= dWord → Changement que l'on veut capturer (Filename, Dirname, Attributes, Size…) plus d'infos ici
On met ces Handle dans un array de ce type : (par exemple)
THandleList = array [0..MAXIMUM_WAIT_OBJECTS - 1] of THandle;
Ensuite on attends une modification avec WaitForMultipleObjects:
function WaitForMultipleObjects( nCount:DWORD; lpHandles : PWOHandleArray; bWaitAll:WINBOOL; dwMilliseconds:DWORD):DWORD
nCount
= nombre de handle dans la listelpHandles
= pointer vers le premier enregistrement de la liste de typeTHandleList
(voir ci-dessus) (dans notre cas=@HandleList[0]
)bWaitAll
= Boolean → On attend toutes les modifs ??? (False
dans notre cas)dwMilliseconds
= Temps d'attente en Millisecondes
La fonction WaitForMultipleObjects
retourne un DWord qui peut être interprété de la façon suivante:
- $102 (258) = TIMEOUT, le temps d'attente (
dwMilliseconds
) s'est écoulé. - $FFFFFFFF (-1) = FAILED !
- $0..$40 = Index (+WAIT_OBJECT_0) du Handle dans la liste correspondant au répertoire qui a été modifié
- $80..$C0 = Index (+WAIT_ABANDONED_0) du Handle qui… je sais pas trop
Plus d'infos → Valeur de retour de la fonction WaitForMultipleObjects
On traite la valeur retournée par la fonction WaitForMultipleObjects
.
Puis on retourne a la surveillance par un FindNextChangeNotification et rebouclage sur WaitForMultipleObjects:
function FindNextChangeNotification(hChangeHandle:HANDLE):WINBOOL;
ou le parametre hChangeHandle
est le Handle du répertoire modifié precedement.
Ce Handle est récuperable dans la liste des Handles THandleList passé a la fonction WaitForMultipleObjects
a l'index retourné par cette méme fonction… (suis-je bien claire ???)
Exemple de code (Dans un Thread, car WaitForMultipleObjects
est une fonction bloquante…) :
// vIndex: integer; // vHandleList : THandleList (voir ci-dessus) // FCount = nombre de handle dans la liste vHandleList // FWaitMs = nombre de millisecondes a attendre // FDirChangedHandle = Handle du Find Change Notifier du répertoire qui a été modifié // Le Handle du Find Change Notifier est retourné par la function FindFirstChangeNotification (voir ci-dessus) while not Terminated do begin vIndex := WaitForMultipleObjects(FCount, vHandleList[0], False, FWaitMs); if (vIndex >= WAIT_OBJECT_0) and (vIndex < WAIT_OBJECT_0 + FNHandleList.Count) then begin FDirChangedHandle :=FHandleList[vIndex - WAIT_OBJECT_0]; ... FindNextChangeNotification( FDirChangedHandle); end; end;
ReadDirectoryChangesW
A la Procmon
Procmon est un excellent utilitaire qui montre en temps réel les accès aux fichiers par les processus.
Reste a savoir comment il fait ?
Apparemment cette solution impliquerai l'utilisation d'un drivers annexe, ce qui reste relativement fastidieux…
Piste OpenFilesView de Nirsoft
Une piste peut etre sur la page→https://www.nirsoft.net/utils/opened_files_view.html.
Un programme de Nirsoft apparement similaire a Procmon qui fonctionne de la facon suivante:
OpenedFilesView utilise l'API NtQuerySystemInformation pour énumérer tous les handles dans le système.
Après avoir filtré les handles non-fichiers, il utilise un driver temporaire - NirSoftOpenedFilesDriver.sys pour lire les informations sur chaque handle depuis la mémoire du noyau.
Ce driver est automatiquement déchargé du système lorsque vous quittez l'utilitaire OpenedFilesView.
Projet de ShareVB
Sur cette page : Savoir quel fichier est utilisé par telle application : la liste des fichiers ouverts sur le système (pour 2k/xp/2k3) ShareVB partage un projet en VB qui ferait apparemment le taf… a étudier.
Je met ce projet sur mon site, on sait jamais dés fois qu'il disparaisse !!! 36281-1110458-savoir-quel-fichier-est-utilise-par-telle-application-la-liste-des-fichiers-ouverts-sur-le-systeme-pour-2k-xp-2k3.zip
En vrac à étudier
Sources & Ressources
- Voir aussi → JvChangeNotify.TJvChangeNotify class in JCL.
- Voir aussi → Travailler avec les Disques