9
votes

FichiersSystemwatcher des fichiers au sous-répertoire

J'essaie d'être informé si un fichier est créé, copié ou déplacé dans un répertoire que je regarde. Je veux seulement être averti sur les fichiers cependant, pas les répertoires.

Voici une partie du code que j'ai actuellement: xxx

problème est, si je déplace un répertoire qui contient un fichier dedans, je ne reçois aucun événement pour ce fichier.

Comment puis-je l'obtenir pour m'avoir informé pour tous les fichiers ajoutés (quels que soient le mode de répertoire observé ou ses sous-répertoires?

Incase Je n'ai pas suffisamment expliqué ... j'ai regardervedirectory , et annuaire1 . Directory1 contient hello.txt . Si je déplace répertoire1 dans regisdeddirectory , je veux être averti pour hello.txt .

edit: je dois noter que mon système d'exploitation est Windows 8. et je reçois une notification pour des événements de copie / coller, mais ne déplacez pas les événements (faites glisser-déposer dans le dossier).


3 commentaires

FileSystemWatcher.IncludesubDirectories Propriété devrait faire cela .


Pour moi, le code ci-dessus fonctionne très bien.


@ALEXFILIPOVICI: Josh a déjà inclus cette ligne dans son code


3 Réponses :


4
votes

Peut-être que cette solution de contournement pourrait être utile (mais je ferais attention à la performance car elle implique une récursive): xxx


0 commentaires

1
votes

Copie et Dossiers en mouvement

Le système d'exploitation et l'objet FileSystemWatcher interprète une action de coupe et une action de déplacement comme une action renommée pour un dossier et son contenu. Si vous coupez et coller un dossier avec des fichiers dans un dossier surveillé, l'objet FilesSystemWatcher signale uniquement le dossier comme neuf, mais pas son contenu, car ils ne sont essentiellement renommés.

Référence: MSDN


1 commentaires

Mais j'ai défini la propriété IndemnubDirectories , et je surveille pour les événements renommés. Toujours aucun événement ne fait apparaître.



4
votes

Ajoutez des filtres supplémentaires à votre notifyfilters . Pour le moment, vous ne surveillez que des modifications des noms de fichiers. Que, avec vos gestionnaires modifiés et renommés devraient faire le travail. XXX

Cela semble fonctionner uniquement pour des actions de copie / coller. Pour les actions de coupe / pâte (ou de glisser-déposer), ajoutez le filtre notify suivant également: notifyfilters.directoryname .

J'ai joué avec elle un peu plus et, en effet, une seule notification pour le dossier de niveau supérieur est disponible. A du sens, si vous venez penser à cela. Puisque le type de changement est créé , vous savez certainement que tous les fichiers et tous les dossiers à l'intérieur sont nouveaux et que vous pouvez les traiter.

Donc, @ Alexfilipovici's Approparation est la seule viable , bien que j'entiendrais le résultat (dossier) et le traiter sur un thread de travailleur (ou une tâche, peu importe). Vous ne voulez pas passer trop de temps à l'intérieur d'un gestionnaire d'événements Fswatcher, surtout si les fichiers arrivent à un taux élevé.


3 commentaires

J'ai essayé cela, mais je n'ai toujours pas de notification pour faire des événements de déménagement.


@JOSH: réponse mise à jour. Aussi le testé sur la victoire 8 et fonctionne bien.


Le notifyfilters.directoryName Flees est incendie un événement pour le répertoire, mais pas le contenu (ce que j'essaie de vous être informé).