10
votes

QF QFileSystemWatcher: Signal filechanged () est émis une seule fois

J'essayais le qfileSystemwatcher et cela ne fonctionne pas comme prévu. Ou est-ce que je fais quelque chose de mal?

J'ai défini le qfilesystemwatcher pour regarder un seul fichier. Lorsque je modifierai le fichier pour la première fois, filechanged () est émis, c'est bon. Mais lorsque je modifierai à nouveau le fichier, filechanged () n'est plus éditeur.

voici le code source:

Main. CPP xxx

mainwindow.h xxx

MainWindow. CPP xxx

merci pour vos réponses.

EDIT 1

I a exécuté ce code sous Linux.

edit 2

Je dois vraiment vérifier tous les fichiers métaposost dans un arbre donné par un seul répertoire, qu'ils soient modifiés. Je vais probablement coller à ma solution alternative, qui doit exécuter Qticer chaque seconde et vérifier manuellement tous les fichiers. Le QFileSystemwatcher fait probablement cela de manière similaire en interne, mais probablement plus efficacement.


8 commentaires

QFileSystemWatcher est une classe wrapper dépendante de la plate-forme pour une API de montrage de fichier / répertoire natif, il est donc important de savoir que la plate-forme est importante.


La plate-forme est Linux.


Je suis un peu surpris. Je devais écrire du code sous Linux pour gérer l'effet que lorsque j'ai écrit des fichiers volumineux (Serveral 100 Mo), le signal a tiré plusieurs fois. Avez-vous déménagé ou renommé votre dossier?


J'ai écrit dans mon fichier dans un éditeur de texte, puis j'ai enregistré les modifications. Pour la première fois, le signal a été émis, mais plus jamais.


Signal Directorychanged () est toujours émis. C'est vraiment bizarre ... Je ne comprends pas pourquoi est-ce le cas. Ce ne serait pas un problème, si j'ai pu obtenir le nom du fichier modifié à partir du signal DirectoryChanged () , mais je ne pense pas que ce soit possible.


@pizet, des suppositions pures, mais depuis l'observation des arrêts, lorsqu'un fichier est supprimé ou renommé, pourrait-il être que votre éditeur de texte supprime le fichier et le recréche quand il l'enregistre? Et oui, je sais que cela semble fou. :-) Mais devrait être facile à tester: 'ls -i '. Vérifiez le numéro d'inode avant et après la sauvegarde.


Eh bien, cela expliquerait probablement tout, mais je ne sais pas. J'utilise Vim. Lorsque vous appelez watcher-> fichiers () , je reçois toujours le chemin de surveillance, le fichier est donc toujours toujours regardé ... je ne sais pas. Peut-être que le problème est que je fais quelque chose de stupide ici et que je ne le sais pas. Mais quand j'utilise un autre éditeur, il se comporte de la même manière.


@Greenflow, tu avais raison. Wow, donc ce qfilesystemwatcher est totalement inutile pour moi. C'est une vraie pitié.


3 Réponses :


14
votes

avait le même problème juste maintenant. Semble que qfilesystemwatcher pense que le fichier est supprimé même s'il n'est modifié que. Bien au moins sur le système de fichiers Linux. Ma solution simple était la suivante: xxx

ajoutez ce qui précède à votre gestionnaire de filecharged () . Changer le mot watcher si nécessaire.


3 commentaires

Addpath donne souvent un avertissement "Fichier n'existe pas", comment dois-je le gérer dans la fonction de gestionnaire, devrais-je attendre quelques temps avant d'appeler Addpath


@ user3450805 Ma réponse originale était la suivante: Si (QFile :: Existe (Chemin)) {Watcher-> Addpath (chemin); } mais les tapis pensaient qu'il devait vraiment vraiment le modifier ...


@Peter, j'ai retourné à votre version d'origine, car le test n'est pas redondant. Par exemple, le fichier peut avoir été supprimé, ce qui entraîne un avertissement comme mentionné par User3450805.



3
votes

Je peux confirmer votre problème avec QT5 et Linux actuels. En plus de la réponse donnée par Peter j'ai résolu ce problème en ajoutant le code suivant à la fin de la fonction d'emplacement: xxx

Notez que si vous ajoutez le chemin immédiatement, le fichier fait souvent Vous n'existerez pas encore, vous obtenez un avertissement et rien ne sera ajouté du tout et l'observateur perd ce chemin. Par conséquent, vous devez attendre / dormir jusqu'à ce que le fichier soit de retour à la vie, puis ajoutez-le.

Notez également que dans cet exemple, j'ai utilisé C ++ 11 et inclus et pour la réalisation du sommeil.


0 commentaires

13
votes

J'ai eu le même problème à utiliser qt5 sur Linux. Découvert la raison:

Certains éditeurs de texte, comme Kate, ne modifiez pas le contenu d'un fichier, mais remplacez le fichier d'origine par un nouveau fichier. Le remplacement d'un fichier supprimera l'ancien ( in_delete_self événement), donc qt arrêtera de regarder le fichier.

Une solution consiste également à regarder également le répertoire du fichier pour les événements de création.


1 commentaires

Merci d'avoir expliqué plutôt que de simplement cracher la solution. =)