Utilisation de FileSystemWatcher pour surveiller un répertoire

j'utilise une application Windows Forms pour surveiller un répertoire et déplacer les fichiers qu'il contient Vers un autre répertoire.

au moment où il va copier le fichier dans un autre répertoire, mais quand un autre fichier est ajouté il se terminera juste avec aucun message d'erreur. Parfois il copie deux fichiers avant de finir sur le troisième.

est-ce parce que j'utilise une application Windows Form plutôt qu'une application console? Est il possible que je peux arrêter le programme de la fin et continuer à regarder l'annuaire?

private void watch()
{
  FileSystemWatcher watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
  //Copies file to another directory.
}
73
demandé sur Neolisk 2013-02-22 09:30:07

3 réponses

le problème était les filtres de notification. Le programme essayait d'ouvrir un fichier qui était encore en train de copier. J'ai enlevé tous les filtres de notification sauf pour LastWrite.

private void watch()
{
  FileSystemWatcher watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastWrite;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}
106
répondu cheeseman 2013-03-06 16:06:29

vous n'avez pas fourni le code de manipulation de fichier, mais je suppose que vous avez fait la même erreur que tout le monde fait lors de la première écriture d'une telle chose: l'événement filewatcher sera soulevé dès que le fichier est créé. Cependant, il faudra un certain temps pour que le fichier soit fini. Prenez une taille de fichier de 1 Go par exemple. Le fichier peut être créé par un autre programme (Explorer.mais il faudra des minutes pour terminer ce processus. L'événement est soulevé au moment de la création et vous devez attendez que le fichier soit prête à être copiée.

vous pouvez attendre qu'un fichier soit prêt en utilisant cette fonction dans une boucle.

20
répondu nvoigt 2017-05-23 12:18:17

la raison peut être que l'observateur est déclaré comme variable locale à une méthode et il est ordures collectées lorsque la méthode est terminée. Vous devriez le déclarer comme membre de la classe. Essayez ce qui suit:

FileSystemWatcher watcher;

private void watch()
{
  watcher = new FileSystemWatcher();
  watcher.Path = path;
  watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
                         | NotifyFilters.FileName | NotifyFilters.DirectoryName;
  watcher.Filter = "*.*";
  watcher.Changed += new FileSystemEventHandler(OnChanged);
  watcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
  //Copies file to another directory.
}
16
répondu user1912419 2015-08-13 08:57:43