Comment être averti du changement de fichier / répertoire en C / C++, idéalement en utilisant POSIX

Le sujet dit tout - normalement facile et multi-plateforme est de sonder, intelligemment. Mais chaque système d'exploitation a des moyens de notifier sans interrogation. Est-ce possible d'une manière raisonnablement multi-plateforme? (Je ne me soucie vraiment que de Windows et Linux, mais j'utilise mac, alors j'ai pensé que posix pourrait aider?)

27
demandé sur Michael Neale 2008-09-14 14:37:55

7 réponses

, les utilisateurs Linux peuvent utiliser inotify

Inotify est un sous-système du noyau Linux qui fournit un événement de système de fichiers notification.

Quelques goodies pour Windows boursiers:

28
répondu aku 2008-09-14 11:55:35

La bibliothèque Qt a une classe QFileSystemWatcher qui fournit des notifications multiplateformes lorsqu'un fichier change. Même si vous n'utilisez pas Qt, parce que la source est disponible, vous pouvez la regarder comme un exemple pour votre propre implémentation. Qt a des implémentations distinctes pour Windows, Linux et Mac.

17
répondu David Dibben 2016-05-08 07:45:25
3
répondu macbirdie 2016-09-27 16:10:05

Je ne pense pas que POSIX lui-même ait des facilités pour cela. Le plus proche de la multi-plateforme que j'ai vu est FAM , qui semble fonctionner Pour Linux, BSD et Irix, mais je ne suis pas à quel point il serait facile de le porter sur Windows et MacOS.

1
répondu Chris Jester-Young 2008-09-14 10:46:53

J'ai déjà construit ce système pour une utilisation dans une base de code C++ commerciale - tant que vous n'avez pas besoin de toutes les choses étranges sous le soleil, les systèmes Windows et POSIX ont beaucoup de chevauchement que vous pouvez abstraire.

POSIX: utilisez inotify - c'est tout un système littéralement construit pour ce travail
Windows: utilisez "modifier les événements". Vous devez construire plus de colle et vous rapporter (toutes les API dont vous avez besoin sont disponibles, il n'y a tout simplement pas le 1-stop-shopping inotify vous donne).

Le les choses communes que vous pouvez détecter dans votre "thread de notification" pour les événements de transfert sont:
1) fondamentalement, toute opération invasive prise en charge par boost::filesystem, à l'exception (possible) de la modification des autorisations. Ce sont des choses comme Déplacer, Créer, supprimer, copier des dossiers et des fichiers.
2) lit et écrit dans des fichiers (esp. écrire). Sachez que si vous utilisez des E/S asynchrones, les notifications peuvent apparaître hors service.
3) Quand un nouveau volume arrive, comme quelqu'un qui connecte un flash lecteur.

Inotify vous donne surtout un niveau fou de contrôle à grain fin, Windows moins. Avec inotify, vous pouvez littéralement surveiller tout ce que le système de fichiers fait en temps quasi réel si vous le souhaitez vraiment. Je sais #3 est possible avec les deux sans interrogation, mais sachez qu'il peut être vraiment difficile de le faire fonctionner correctement sur l'un ou l'autre système.

1
répondu Zack Yezek 2013-12-20 08:29:14

Je crois que OS X a maintenant des crochets/rappels appropriés car ils étaient nécessaires pour l'indexation Spotlight.

Sous linux, vous aurez le problème supplémentaire qu'il existe plusieurs systèmes de fichiers couramment utilisés. Si vous avez besoin de la fonctionnalité pour une quantité limitée de fichiers/répertoires, j'essaierais de rechercher activement des modifications à intervalles réguliers.

0
répondu MattW. 2008-09-14 11:25:16

Libevent ou libev semblent être ce que vous voulez, bien que je n'ai pas utilisées.

0
répondu paleozogt 2009-04-14 18:12:14