Comment surveiller les modifications de fichiers texte avec C ++? Difficulté: Non .NET
-
04-07-2019 - |
Question
Cas d'utilisation: une application tierce souhaite contrôler par programme un fichier texte généré par un autre programme. Le fichier texte contient les données que vous souhaitez analyser lors de la mise à jour.
Je trouve beaucoup de réponses à cette question autour de FileSystemWatcher mais disons que vous écrivez une application pour une machine Windows et que vous ne pouvez pas garantir que .NET est installé.
Existe-t-il des bibliothèques disponibles pour cela, ou vais-je simplement devoir lancer ma propre solution alors?
Merci.
La solution
Vous pouvez surveiller un répertoire avec la FindFirstChangeNotification sur toutes les fenêtres. .
C’est efficace si vous savez où se trouve le fichier. Dans le cas contraire, vous pouvez utiliser le pilote virtuel / Filemon décrit ci-dessous pour rechercher les modifications éventuelles sur le système.
Exemple de code ici
Autres conseils
Une solution plus simple pourrait consister à vérifier le dernier horodatage modifié du fichier.
Si vous utilisez la fonction _stat64 () à cette fin, cela devient une solution multiplate-forme.
Exemple de code:
struct __stat64 fileinfo;
if(-1 != _stat64(filename, &fileinfo)
return fileinfo.st_mtime;
se présente comme suit: Suivi du processus ayant ouvert un fichier particulier
sysinternal a donné des conseils et outils
Cela ressemble beaucoup à ce que FileMon, de sysinternals (maintenant MS) fait. Pour ce faire, ils créent un pilote de périphérique virtuel chargé dynamiquement. ils ont une bonne description de son fonctionnement ici :
Fonctionnement de FileMon
Pour le pilote Windows 9x, le coeur de FileMon est dans le périphérique virtuel pilote, Filevxd.vxd. C'est dynamiquement chargé, et dans son initialisation il installe un filtre de système de fichiers via le Service VxD, IFSMGR_InstallFileSystemApiHook, à s'insère dans la chaîne d'appel de toutes les demandes de système de fichiers. Sur Windows NT le coeur de FileMon est un fichier pilote système qui crée et attache des objets de périphérique de filtre à objets de périphérique du système de fichiers cible afin que FileMon verra tous les IRP et Les demandes FastIO adressées aux lecteurs. Lorsque FileMon voit une ouverture, créez ou appel proche, il met à jour un interne table de hachage qui sert de mappage entre les descripteurs de fichiers internes et les fichiers noms de chemins. Chaque fois qu'il voit des appels qui reposent sur les poignées, il recherche le manipuler dans la table de hachage pour obtenir le nom complet pour l'affichage. Si un L'accès basé sur le handle référence un fichier ouvert avant le démarrage de FileMon, FileMon échouera à trouver la cartographie dans son table de hachage et présentera simplement le la valeur de la poignée à la place.