2010-11-27 6 views
4

Je souhaite détecter tous les changements de dossier dans un dossier spécifique (à l'exception des modifications de données). J'ai décidé d'utiliser System.IO.FileSystemWatcher pour gérer cela.C# Le fichier de détection se déplace dans différents dossiers

// 
// fileSysWatchFile 
// 
this.fileSysWatchFile.EnableRaisingEvents = true; 
this.fileSysWatchFile.IncludeSubdirectories = true; 
this.fileSysWatchFile.NotifyFilter = System.IO.NotifyFilters.FileName; 
this.fileSysWatchFile.SynchronizingObject = this; 
this.fileSysWatchFile.Created += new System.IO.FileSystemEventHandler(this.fileSysWatchFile_Created); 
this.fileSysWatchFile.Deleted += new System.IO.FileSystemEventHandler(this.fileSysWatchFile_Deleted); 
this.fileSysWatchFile.Renamed += new System.IO.RenamedEventHandler(this.fileSysWatchFile_Renamed); 

Dans la mesure du possible ... De nouveaux fichiers sont détectés. Les suppressions de fichiers sont détectées. Les noms de fichier sont détectés.

Lorsque je déplace un fichier vers un sous-dossier, il détecte d'abord une suppression de fichier puis un nouveau fichier.

Je m'attendrais à ce qu'un mouvement soit identique à un changement de nom sauf le chemin. Il semble que ce ne soit pas. Puis-je détecter les déplacements de fichiers d'une manière de sauvegarde? Par ailleurs ... Je veux seulement détecter les changements de fichiers et pas les changements de répertoire.

Edit:

Informations additionnelles pourquoi je dois détecter mouvements et ne peux pas vivre avec supprimer, créer:

Je veux rejouer les mêmes modifications sur un autre lecteur. Si j'obtiens une suppression en premier, je supprime le fichier shadow. Puis-je obtenir le créer un événement de fichier et le fichier d'origine est déjà perdu :-(.

J'ai un lecteur qui est le lecteur regardé ... Et un lecteur B qui a des fichiers avec les mêmes noms de fichiers.

Toutes les modifications de fichiers eXept changements de données doivent être rejouées sur le lecteur B.

+0

Le problème principal est que je ne peux pas dire combien de temps il y a entre l'événement delete et l'événement create, car je ne peux pas implémenter une solution de contournement de sauvegarde en le détectant par un contrôle de chemin retardé – fpdragon

+0

Ce serait une valeur très surprenante pour un déplacement de fichier, puisque Windows ne fait que mettre à jour le chemin du fichier, même s'il est dit que c'est un delete + create – SWeko

+0

AFAIK FileSystemWatcher est une approche de type effort. les notifications seront abandonné silencieusement. Il est donc possible que votre application rate certains événements lorsque le système est occupé. – Daniel

Répondre

1

Le fichier supprimer/fichier créer fonctionnalité est ce qui se cache derrière un mouvement de fichier. Il est similaire à renommer si vous vous déplacez un fichier d'un dossier un dossier, mais que se passe-t-il si vous déplacez un fichier d'un disque à un autre ou si vous déplacez un fichier entre des machines?

Et, si je regarde un dossier spécifié, aussi longtemps que le fichier n'est pas là, il pourrait aussi bien avoir été supprimé :)

Si vous êtes sûr que vous voulez attraper le fichier déplacé "événements" (à partir de un dossier surveillé dans un sous-dossier surveillé), je voudrais maintenir une liste de fichiers récemment supprimés, et à chaque événement créé par fichier, vérifiez si le fichier est cette liste, indiquant un déplacement de fichier de facto.

+0

exactement ... Je dois faire une différence entre le disque se déplace et se déplace vers un autre disque ... s'il vous plaît voir mes infos ajoutées pour comprendre mon problème. – fpdragon

+0

Êtes-vous sûr de ne pas pouvoir le faire avec le service de système de fichiers distribués? Il existe également d'autres solutions pour la réplication de fichiers, vous n'avez pas besoin de réinventer la roue. – SWeko

+0

Si le déplacement vers un autre disque est effectué, je n'aurais même qu'un événement de suppression. Ce n'est pas la situation que j'ai ... – fpdragon

1

Vous pouvez utiliser le pilote de filtre de système de fichiers pour suivre l'opération de changement de nom de fichier. En fait, FS Filter est une meilleure approche que FileSystemWatcher. FileSystemWatcher ne fournit pas la fiabilité et la flexibilité pour certains cas (vous pouvez voir le nombre de questions concernant FileSystemWatcher et ses défauts et limitations). Le filtre FS vous permet de suivre les demandes dès qu'elles atteignent le système de fichiers.

Vous pouvez écrire votre propre pilote de filtre ou utiliser notre produit CallbackFilter.

+1

Donc, il n'y a pas de solution gratuite ou d'échantillon de code? Je suppose que vous voulez vendre votre programme;) – fpdragon

+0

Pourquoi pas, Windows Driver Kit contient un exemple de pilote de filtre FS. Mais en général, le développement en mode noyau prend beaucoup de temps et nécessite des compétences assez sérieuses. C'est pourquoi nous proposons la solution qui permet à tout développeur d'obtenir tous les avantages du pilote de filtre FS sans codage manuel en mode noyau. –

0

Ce n'est pas une véritable solution du problème, mais je réussi à avoir une solution rapide et sale:

D'abord, je suis mise en mémoire tampon tous les événements pendant un certain temps (testé avec 100ms, mais nous allons voir à quelle vitesse il peut aller).

Si un événement est de 100ms dans le tampon, je vérifie s'il y a un autre événement dépendant. Donc pour Supprimer je recherche tout crée et pour créer je recherche toutes les suppressions.

Si j'en trouve un, je remplacerai les deux événements par un seul mouvement.

Il ya quelques riscs avec ce workarround:
1.) Je ne peux pas dire ce qui vient en premier, supprimer ou créer. Il semble que cela est à chaque fois différent
2.) Si le retard est à court, le fichier est supprimé et perdu :-(

Mais tant que je ne meilleure solution je dois vivre avec cela.

Questions connexes