Existe-t-il quelque chose comme inotify sur Windows?

103

Avec le système d'exploitation Linux, il existe le sous-système ionotify qui notifie à une application les modifications apportées au système de fichiers.

Cependant, je suis principalement un utilisateur Windows, alors je me demandais s'il existe un moyen similaire de surveiller les modifications du système de fichiers?

Johansson
la source
9
Je ne pense pas que de telles questions soient hors sujet. La question demande une API OS qui est très différente de tout outil / bibliothèque de logiciels. Peut-être que cela peut être formulé différemment, comme comment être notifié dans une application Windows lorsque des fichiers / fichiers particuliers sont modifiés.
balki
1
Voté pour rouvrir: La question demande une alternative comparable à une API de système d'exploitation spécifique et me lit de manière figuante comme "Je viens d'Angleterre où j'utilise une fourchette pour manger de la nourriture, au Japon, quel ustensile est-ce que j'utilise de la même manière? " La réponse acceptée en utilisant cette analogie est «utiliser des baguettes».
David

Réponses:

42

Si vous utilisez .net , utilisez FileSystemWatcher. Plus d'informations ici: http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

Si vous utilisez C , l' utilisation FindFirstChangeNotification, FindNextChangeNotification, ReadDirectoryChangesW. Plus d'informations ici: http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx

Sous OSX , l'API pertinente est l' fseventsAPI.

Ils sont tous subtilement différents les uns des autres, et ils ont tous une fiabilité douteuse dans les cas extrêmes. En général, vous ne pouvez pas compter sur ces API pour une vue complète de tous les changements 100% du temps. La plupart des utilisateurs de la surveillance du système de fichiers le combinent avec des analyses périodiques pour compenser les informations perdues ou incomplètes de l'API push.

blucz
la source
6
Pouvez-vous s'il vous plaît donner une citation sur la "fiabilité douteuse dans le cas de pointe pour inotify?
Pharaun
18
Si un consommateur d'une api fs watcher est plus lent à lire les événements qu'un autre processus ne les génère, le noyau doit soit bloquer les modifications du système de fichiers dans l'autre processus (éventuellement plus prioritaire), soit permettre une croissance illimitée du tampon. La profondeur de la mémoire tampon d'inotify (comme documenté dans la page de manuel) est contrôlée par / proc / sys / fs / inotify / max_queued_events. Au-delà de cela, vous recevez une notification IN_Q_OVERFLOW - c'est bien, mais vous êtes toujours dans une situation où vous devrez peut-être effectuer une nouvelle analyse de temps en temps.
blucz
Aha droit, je lisais récemment sur la file d'attente. Je pense que ce cas de pointe dépendrait du nombre de fichiers que vous surveillez et cela dépend également de savoir s'il est essentiel de suivre tous les changements ou si quelques-uns peuvent être manqués. Mais c'est un bon point. Merci :)
Pharaun
@blucz Je me demandais comment les gens du noyau résolvent ces situations. C'est bon de savoir qu'ils font cela, cela rend plus confiant dans la conception et la mise en œuvre.
n611x007
11

JNotify ou FileMon de Microsoft.

Eugène
la source
8
JNotify était parfait pour moi car j'avais besoin d'une compatibilité multiplateforme. J'ai même pu écrire un seul script bash qui fonctionnait sous cygwin, mac et linux en supposant uniquement que JAVA_HOME était correctement défini. Cela a été une grande aide pour le débogage des problèmes sur les machines des clients, quand ils disent "cela a supprimé mon fichier!" Je peux en fait regarder le journal et essayer de comprendre comment / quand cela s'est produit.
cmyers
1
FileMon est maintenant ProcessMonitor technet.microsoft.com/en-us/sysinternals/bb896645
MECU
10

Un peu tard mais ...

Windows dispose d'une fonction similaire aux événements OSX dans laquelle vous pouvez surveiller les événements sans exécuter d'application. Le journal Windows USN effectue le suivi de toutes les modifications de fichiers. Jeffrey Richter (auteur de Advanced Windows) a écrit un article formidable avec des exemples de travail pour MSDN Journal. Mise à jour : article maintenant sur archive.org puisque MSJ n'est plus en ligne chez MS.

Documentation MSDN pour les journaux de modification USN.

Les journaux de modifications USN sont probablement meilleurs si vous créez des applications telles que des outils de sauvegarde ou des index qui doivent surveiller des volumes entiers.

Peter Krnjevic
la source
Le journal USN est-il différent, s’y fier évite le comportement bogué de FileSystemWatcher| FindFirstChangeNotification PhillipBrandonHolmes était en parlant de ?
n611x007
4
Cela fait un moment que je n'ai pas travaillé avec cela, mais il n'utilise ni FileSystemWatcher ni FindFirstChangeNotification. J'ai commencé à écrire un observateur d'événements Windows dans Go, basé en grande partie sur les exemples de Jeffery Richter. D'après le peu de test que j'ai fait, il est solide comme le roc et ne manque rien, semblable à fsevents dans OS X. Gist est ici: gist.github.com/pkrnjevic/7219861
Peter Krnjevic
@PeterKrnjevic Pouvez-vous mettre à jour le lien de l'article de Jeffrey Richter?
SOUser
@SOUser, en raison de MS bitrot, l'article est maintenant lié à archive.org.
Peter Krnjevic
3

FileSystemWatcher () n'est pas fiable principalement en raison du fait que la gestion des erreurs pour le tampon de l'observateur est plus ou moins incomplète. En raison d'un manque de chemin d'accès et d'informations détaillées sur la gestion des erreurs, Microsoft ne vous donne aucun moyen de récupérer ou d'interroger manuellement le répertoire de travail.

Le JNotify pour Windows n'est pas fiable non plus car ce bogue ^ dérive de win32. JNotify utilise win32. Donc, ce n'est pas différent de FileSystemWatcher ().

Phillip Brandon Holmes
la source
En réfléchissant à la manière de concevoir des rôles pour résoudre ce problème de type «vitesse» / ​​«course» / ​​«débordement», je me suis demandé comment les noyaux y parvenaient. Intéressant. Cette chose se produit également avec la mise en réseau et la journalisation. Ce problème a-t-il un nom?
n611x007
Oui, son nom est "bug". Le bogue (win32) a été laissé dans chaque système d'exploitation créé par Microsoft à ce jour. Cela rend tout système d'exploitation Microsoft impropre à une solution de type surveillance de fichiers. Vous devez aller * nix pour l'accomplir. Parfois, je pense qu'ils ont intentionnellement laissé ce débordement de tampon pour des raisons de sécurité.
Phillip Brandon Holmes
haha .. ouais .. son nom est kludge de cluster intentionnel afin que le système de fichiers de Microsoft ne puisse pas être observé intentionnellement. C'est un bug qu'ils ont laissé en raison de problèmes de sécurité.
Phillip Brandon Holmes
1

J'ai fait un peu de recherche, je me souviens avoir vu quelque chose de similaire pour Windows. Il existe FileSystemWatcher pour .NET. Son principalement pour NT ou XP et en avant.

Pharaun
la source
Il est plus généralement disponible uniquement sur les systèmes de fichiers NTFS, mais pas sur FAT16, FAT32 ou même le nouvel exFAT.
Mastacheata