Notification de modification de contenu de répertoire

Le
Philippe GREMILLET
Bonjour à tous !

Tout d'abord, veuillez m'excuser si ma demande a déjà reçu mille réponses
pertinentes dans le passé
J'écris une appli Win32 en C/C++ dans laquelle j'aimerais, dès l'ajout d'un
nouveau fichier image dans un répertoire dont le nom m'est connu, recevoir
une notification de modification du contenu de ce répertoire (du genre : "un
nouveau fichier a été ajouté"), afin que mon appli charge automatiquement le
nouveau fichier image, effectue les traitement appropriés, et affiche le
résultat dans une fenêtre qui lui est propre.
J'ai dans l'idée qu'effectuer un polling régulier du contenu du répertoire
("FindFirstFile") n'est pas efficace, et surcharge bêtement le système.
J'ai vu dans le SDK Win32 la fonction "SHChangeNotifyRegister", qui semble
appropriée à vue de nez, mais dont l'utilisation me paraît un peu hasardeuse
: ja ne saisi guère (entre autres !) comment remplir le contenu de
l'ITEMIDLIST décrivant le répertoire cible
Merci de me dire si cette approche est la bonne et, si oui, quelles sont les
étapes à effectuer et, si non, par quel bout attaquer la chose !

Cordialement,

Philippe Gremillet, développeur indépendant
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
No_Name
Le #18556551
Philippe GREMILLET avait écrit le 2/2/2009 :
Bonjour à tous !

Tout d'abord, veuillez m'excuser si ma demande a déjà reçu mille réponses
pertinentes dans le passé...
J'écris une appli Win32 en C/C++ dans laquelle j'aimerais, dès l'ajout d'un
nouveau fichier image dans un répertoire dont le nom m'est connu, recevoir
une notification de modification du contenu de ce répertoire (du genre : "un
nouveau fichier a été ajouté"), afin que mon appli charge automatiquement le
nouveau fichier image, effectue les traitement appropriés, et affiche le
résultat dans une fenêtre qui lui est propre.
J'ai dans l'idée qu'effectuer un polling régulier du contenu du répertoire
("FindFirstFile"...) n'est pas efficace, et surcharge bêtement le système.
J'ai vu dans le SDK Win32 la fonction "SHChangeNotifyRegister", qui semble
appropriée à vue de nez, mais dont l'utilisation me paraît un peu hasardeuse
ja ne saisi guère (entre autres !) comment remplir le contenu de


l'ITEMIDLIST décrivant le répertoire cible...
Merci de me dire si cette approche est la bonne et, si oui, quelles sont les
étapes à effectuer et, si non, par quel bout attaquer la chose !

Cordialement,

Philippe Gremillet, développeur indépendant



Il me semble qu'un Timer battant la seconde (par exemple) pourrait vous
permettre d'effectuer cette vérification régulièrement sans surcharger
le système. A condition bien entendu que la vérification en question
dure moins d'une seconde ... et cela dépend du nombre de fichiers
présents dans le dossier en question.
No_Name
Le #18556541
Philippe GREMILLET a exposé le 2/2/2009 :
Bonjour à tous !

Tout d'abord, veuillez m'excuser si ma demande a déjà reçu mille réponses
pertinentes dans le passé...
J'écris une appli Win32 en C/C++ dans laquelle j'aimerais, dès l'ajout d'un
nouveau fichier image dans un répertoire dont le nom m'est connu, recevoir
une notification de modification du contenu de ce répertoire (du genre : "un
nouveau fichier a été ajouté"), afin que mon appli charge automatiquement le
nouveau fichier image, effectue les traitement appropriés, et affiche le
résultat dans une fenêtre qui lui est propre.
J'ai dans l'idée qu'effectuer un polling régulier du contenu du répertoire
("FindFirstFile"...) n'est pas efficace, et surcharge bêtement le système.
J'ai vu dans le SDK Win32 la fonction "SHChangeNotifyRegister", qui semble
appropriée à vue de nez, mais dont l'utilisation me paraît un peu hasardeuse
ja ne saisi guère (entre autres !) comment remplir le contenu de


l'ITEMIDLIST décrivant le répertoire cible...
Merci de me dire si cette approche est la bonne et, si oui, quelles sont les
étapes à effectuer et, si non, par quel bout attaquer la chose !

Cordialement,

Philippe Gremillet, développeur indépendant



J'ai trouvé aussi par Google la page suivante :

http://www.cppfrance.com/forum/sujet-MODIFICATION-FICHIER_724609.aspx

où vous trouverez le message suivant :

ReadDirectoryChangesW(.), s'utilise uniquement avec les OS de type
NT, mais est beaucoup plus simple d'utilisation puisqu'elle permet
d'obtenir tous les renseignements souhaités sur le dossier/fichier
modifié.

La fonction ReadDirectoryChangesW(.) permet de préciser un filtre dans
son prototype intervenant sur le type de changement auxquels la
fonction est 'sensible' => pout toi FILE_NOTIFY_CHANGE_SIZE.

Le principe est de créer un thread de polling de ton fichier ou
répertoire (il scrute en permanence d'éventuelles modifications
(while... ReadDirectoryChangesW ), et lorsqu'une modification a lieu tu
pourras alors :

* Soit réagir directement dans le thread de polling,
* soit lever un event pour que le process principal traite l'info.
Philippe GREMILLET
Le #18556761
"No_Name" gm6dgt$dhh$
Philippe GREMILLET a exposé le 2/2/2009 :
Bonjour à tous !

Tout d'abord, veuillez m'excuser si ma demande a déjà reçu mille réponses
pertinentes dans le passé...
J'écris une appli Win32 en C/C++ dans laquelle j'aimerais, dès l'ajout
d'un nouveau fichier image dans un répertoire dont le nom m'est connu,
recevoir une notification de modification du contenu de ce répertoire (du
genre : "un nouveau fichier a été ajouté"), afin que mon appli charge
automatiquement le nouveau fichier image, effectue les traitement
appropriés, et affiche le résultat dans une fenêtre qui lui est propre.
J'ai dans l'idée qu'effectuer un polling régulier du contenu du
répertoire ("FindFirstFile"...) n'est pas efficace, et surcharge bêtement
le système.
J'ai vu dans le SDK Win32 la fonction "SHChangeNotifyRegister", qui
semble appropriée à vue de nez, mais dont l'utilisation me paraît un peu
hasardeuse
ja ne saisi guère (entre autres !) comment remplir le contenu de


l'ITEMIDLIST décrivant le répertoire cible...
Merci de me dire si cette approche est la bonne et, si oui, quelles sont
les étapes à effectuer et, si non, par quel bout attaquer la chose !

Cordialement,

Philippe Gremillet, développeur indépendant



J'ai trouvé aussi par Google la page suivante :

http://www.cppfrance.com/forum/sujet-MODIFICATION-FICHIER_724609.aspx

où vous trouverez le message suivant :

ReadDirectoryChangesW(.), s'utilise uniquement avec les OS de type NT,
mais est beaucoup plus simple d'utilisation puisqu'elle permet d'obtenir
tous les renseignements souhaités sur le dossier/fichier modifié.

La fonction ReadDirectoryChangesW(.) permet de préciser un filtre dans son
prototype intervenant sur le type de changement auxquels la fonction est
'sensible' => pout toi FILE_NOTIFY_CHANGE_SIZE.

Le principe est de créer un thread de polling de ton fichier ou répertoire
(il scrute en permanence d'éventuelles modifications (while...
ReadDirectoryChangesW ), et lorsqu'une modification a lieu tu pourras
alors :

* Soit réagir directement dans le thread de polling,
* soit lever un event pour que le process principal traite l'info.





Merci beaucoup pour vos précieuses infos !

En outre, depuis l'entrée "ReadDirectoryChangesW" du SDK, j'ai accédé à
l'entrée "FindFirstChangeNotification", laquelle contient un exemple qui me
paraît être une excellente base...

Cordialement,

PhGrt
Christian ASTOR
Le #18557211
On 2 fév, 09:59, "Philippe GREMILLET" wrote:

J'écris une appli Win32 en C/C++ dans laquelle j'aimerais, dès l'ajou t d'un
nouveau fichier image dans un répertoire dont le nom m'est connu, recev oir
une notification de modification du contenu de ce répertoire (du genre : "un
nouveau fichier a été ajouté"), afin que mon appli charge automatiq uement le
nouveau fichier image, effectue les traitement appropriés, et affiche l e
résultat dans une fenêtre qui lui est propre.



Voir le très vieil exemple classique FWATCH.C de MSDN pour
ReadDirectoryChangesW()
(modifier flags FILE_NOTIFY_CHANGE_LAST_WRITE
if( fni->Action == FILE_ACTION_MODIFIED)
et
CheckChangedFile()
pour ton cas.
Publicité
Poster une réponse
Anonyme