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

StackOverflow https://stackoverflow.com/questions/61253

  •  09-06-2019
  •  | 
  •  

Question

Le sujet dit tout - normalement, un moyen simple et multiplateforme consiste à interroger intelligemment.Mais chaque système d'exploitation dispose d'un moyen de notification sans interrogation.Est-ce possible de manière raisonnablement multiplateforme ?(Je ne me soucie vraiment que de Windows et Linux, mais j'utilise Mac, alors j'ai pensé que Posix pourrait aider ?)

Était-ce utile?

La solution

Les utilisateurs de Linux peuvent utiliser inotifier

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

Quelques goodies pour les utilisateurs de Windows :

Autres conseils

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

Il y a API d'événements du système de fichiers à partir de Léopard.

Je ne pense pas que POSIX lui-même dispose de fonctionnalités pour cela.Le plus proche du multiplateforme que j'ai vu est FAM, qui semble fonctionner pour Linux, BSD et Irix, mais je ne sais pas à quel point il serait facile de le porter sur Windows et MacOS.

En fait, j'ai déjà construit ce système pour l'utiliser 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 chevauchements que vous pouvez résumer.

POSIIX :Utilisez inotify - c'est tout un système littéralement construit pour ce travail
Les fenêtres:Utilisez « changer d'événements ».Vous devez créer davantage de colle et de rapports vous-même (toutes les API dont vous avez besoin sont disponibles, il n'y a tout simplement pas le guichet unique qu'inotify vous offre).

Les éléments courants que vous pouvez détecter dans votre « fil de notification » pour le transfert d'événements sont :
1) Fondamentalement, toute opération invasive prise en charge par boost::filesystem, à l'exception (possible) de la modification des autorisations.Il s'agit de choses comme déplacer, créer, supprimer, copier des dossiers et des fichiers.
2) Lit et écrit dans des fichiers (en particulier.écrit).Sachez que si vous utilisez des E/S asynchrones, les notifications peuvent apparaître dans le désordre.
3) Lorsqu'un nouveau volume arrive, par exemple si quelqu'un connecte une clé USB.

inotify vous offre en particulier un niveau insensé de contrôle précis, Windows moins.Avec inotify, vous pouvez littéralement surveiller tout ce que fait le système de fichiers en temps quasi réel si vous le souhaitez vraiment.Je sais que le numéro 3 est possible avec les deux sans interrogation, mais sachez qu'il peut être très difficile de le faire fonctionner correctement sur l'un ou l'autre système.

Je pense qu'OS X dispose désormais de hooks/rappels appropriés, car ils étaient nécessaires à l'indexation Spotlight.

Sous Linux, vous aurez le problème supplémentaire du fait que plusieurs systèmes de fichiers sont couramment utilisés.Si vous n'avez besoin de la fonctionnalité que pour un nombre limité de fichiers/répertoires, j'essaierais de rechercher activement des modifications à intervalles réguliers.

libévent ou Libev cela semble être ce que vous voulez, même si je ne les ai pas utilisés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top