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?)
7 réponses
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.
Il y a API des événements du système de fichiers comme Leopard.
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.
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.
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.