J'utilise une application Windows Forms pour surveiller un répertoire et déplacer les fichiers déposés dans un autre répertoire.
Pour le moment, il copiera le fichier dans un autre répertoire, mais lorsqu'un autre fichier est ajouté, il se terminera simplement sans message d'erreur. Parfois, il copie deux fichiers avant de se terminer sur le troisième.
Est-ce parce que j'utilise une application Windows Form plutôt qu'une application console? Existe-t-il un moyen d'arrêter la fin du programme et de continuer à regarder le répertoire?
private void watch()
{
this.watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.*";
watcher.Changed += OnChanged;
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
//Copies file to another directory.
}
public void Dispose()
{
// avoiding resource leak
watcher.Changed -= OnChanged;
this.watcher.Dispose();
}
Vous n'avez pas fourni le code de gestion des fichiers, 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 déclenché dès que le fichier est créé. Cependant, la fin du fichier prendra un certain temps. Prenons par exemple une taille de fichier de 1 Go. Le fichier peut être créé par un autre programme (Explorer.exe le copiant de quelque part), mais cela prendra quelques minutes pour terminer ce processus. L'événement est déclenché au moment de la création et vous devez attendre que le fichier soit prêt à être copié.
Vous pouvez attendre qu'un fichier soit prêt en utilisant cette fonction dans une boucle.
la source
La raison peut être que watcher est déclaré comme variable locale à une méthode et qu'il est récupéré lorsque la méthode se termine. Vous devez le déclarer en tant que membre de la classe. Essayez ce qui suit:
la source
watcher
variable est maintenue en vie (pas de récupération de place) car il s'est abonné à l'événement Changed.true
. Je ne pense pas que le statut des gestionnaires d'événements membres ait à voir avec le ramasse-miettes. Je pense que EnableRaisingEvents a, ce que je pourrais appeler favorablement, un comportement spécial dans ce cas.