2015-04-21 7 views
1

Je veux être averti lorsqu'un fichier est ajouté à "/ test". J'ai donc utilisé le signal directoryChanged de QFilesystemWatcher. Mais quand "cp aa.txt/test" j'ai obtenu le signal directoryChanged et là quand j'ai lu aa.txt j'avais aa.txt incomplet.Lorsque je reçois le signal directoryChanged de QFileSystemWatecher, le fichier nouvellement ajouté n'est pas complété pour être lu

Dans ce cas, comment puis-je savoir que le fichier est prêt à être lu?

FYI, je ne peux pas utiliser le signal fileChanged car je ne connais pas le nom exact du fichier.

+0

avez-vous déjà lu ceci? https://forum.qt.io/topic/9846/is-there-a-way-to-detect-when-a-file-copy-process-finish/2 –

Répondre

0

Malheureusement, il n'y a aucun moyen de le savoir en général, sans une certaine coopération du processus qui écrit dans le fichier. Le processus d'écriture doit verrouiller le fichier pour un accès exclusif, et le processus de lecture doit continuer à essayer d'ouvrir le fichier pour qu'il le lise jusqu'à ce qu'il réussisse - lorsque le processus d'écriture a supprimé le verrou. Tout ce que le signal directoryChanged vous dit est ce qu'il dit sur la boîte: le répertoire a changé, ou dans ce cas, il y a une nouvelle entrée dans le répertoire. Ceci est complètement séparé de ce qui est représenté par cette entrée - quel est le contenu du fichier.

L'observateur du système de fichiers ne représente que la moitié de ce qui est nécessaire ici, et ce n'est pas un problème avec Qt, mais avec les processus. Rappelez-vous que vous essayez de coopérer avec l'écrivain. Pour contourner le problème, si vous avez un moyen de valider le contenu du fichier, vous pouvez faire la même chose en lisant et en validant le fichier: réessayez de lire, avec un certain retard jusqu'à ce que la validation réussisse. Pour éviter une utilisation excessive des ressources, il peut être utile que les retards forment un back-off exponentiel.