2010-10-20 16 views
3

Voici le problème: Je surveille un répertoire en utilisant la fonction Win32 API ReadDirectoryChangesW. Et je dois faire la distinction entre les fichiers nouvellement créés et les fichiers modifiés. Mais il y a des problèmes ... comme toujours :(Win32 C++ ReadDirectoryChangesW "création" et "modification" de la détection de différence de fichier?

Cas:

  1. Je surveille répertoire nouveau/modifier (FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE) Problème:. Après la création de fichiers, nouvel événement de fichier + modifier événement de fichier est mais je n'en ai besoin que d'un seul Comment puis-je éviter cela? Quand le fichier est modifié, je reçois ce que je veux :).
  2. Je contrôle le répertoire uniquement pour le nouveau fichier (FILE_NOTIFY_CHANGE_FILE_NAME) - AUCUN PROBLÈME.
  3. Je contrôle le répertoire uniquement pour le fichier de modification (FILE_NOTIFY_CHANGE_SIZE). Problème: Lors de la création d'un nouveau fichier, une action de modification est déclenchée avec un événement de création de fichier. Comment puis-je éviter cela?

Bien sûr, j'ai implémenté quelques solutions de contournement. Mais, je veux savoir s'il y a une manière élégante de traiter les problèmes que j'ai décrits.

Merci d'avance!

+0

Cela aiderait-il à ignorer les modifications de taille lorsque la taille passe de 0 à non nulle? –

+0

Lors de l'événement, je ne connais pas la taille du fichier, je sais seulement que le fichier est modifié. – dmitril

+0

la seule chose qui aide pour le moment est d'ignorer l'événement suivant, en plaçant une minuterie de 1 seconde et de l'ignorer. Mais c'est un travail autour, pas une solution :) – dmitril

Répondre

4

Vous devriez attraper FILE_NOTIFY_CHANGE_LAST_WRITE, et non FILE_NOTIFY_CHANGE_SIZE, pour un fichier modifié. Les fichiers peuvent être modifiés sans que la taille ne change.

Vous devez également conserver une file d'attente de modifications et l'heure à laquelle elles se sont produites et traiter la file d'attente uniquement si aucune modification n'a été effectuée au cours des 1-2 dernières secondes. Certaines applications peuvent faire des choses très étranges lors de la création ou de la modification de fichiers, et vous aurez probablement besoin de cas particuliers pour les applications populaires si vous prévoyez d'utiliser ce code dans la nature.

ReadDirectoryChanges n'est pas l'une des fonctions winapi les plus sympathiques. Vous ne pouvez probablement pas recevoir deux événements lors de la création du fichier. Je ne suis pas tout à fait sûr si vous obtiendrez une modification supplémentaire pour FILE_NOTIFY_CHANGE_LAST_WRITE lors de la création, mais je pense que vous le ferez probablement. L'utilisation de l'approche de file d'attente vous permettra de jeter facilement l'événement supplémentaire s'il a le même horodatage que l'événement de création.

+0

Sur FILE_NOTIFY_CHANGE_LAST_WRITE vous obtiendrez 3 notifications :) – dmitril