2 votes

Suppression du dossier surveillé par FileSystemWatcher

J'aimerais créer une application où, au lieu de surveiller uniquement un dossier de la hiérarchie racine, ... Je surveille chaque dossier individuellement (en désactivant la surveillance des sous-dossiers).

Cependant, je ne parviens pas à mettre en place une logique de suppression correcte. Je veux pouvoir supprimer n'importe quel dossier de la hiérarchie, soit en interne dans l'application, soit en externe, par exemple via l'explorateur Windows.

Lorsque j'essaie l'une ou l'autre de ces méthodes, il semble que je rencontre des problèmes de verrouillage, car les commandes de suppression ne s'exécutent pas.

Si je désactive la surveillance, alors tout semble fonctionner. Je suppose donc que le problème est d'essayer de supprimer un dossier qui est surveillé.

Y a-t-il un moyen de contourner ce problème ? Idéalement, j'aimerais que le fileSystemWatcher arrête automatiquement de surveiller lorsque le dossier qu'il surveille a été supprimé.

public MainWindow()
{
    InitializeComponent();

    fsw1 = new FileSystemWatcher()
    {
        Path = "Folder",
        NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.LastAccess | NotifyFilters.FileName | NotifyFilters.DirectoryName,
        IncludeSubdirectories = false,
        Filter = "",
        EnableRaisingEvents = true
    };

    fsw1.Deleted += new FileSystemEventHandler(OnFileSystemItemDeleted);

    fsw2 = new FileSystemWatcher()
    {
        Path = "Folder/Folder",
        NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.LastAccess | NotifyFilters.FileName | NotifyFilters.DirectoryName,
        IncludeSubdirectories = false,
        Filter = "",
        EnableRaisingEvents = true
    };

    fsw2.Deleted += new FileSystemEventHandler(OnFileSystemItemDeleted);
}

protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
    base.OnMouseLeftButtonDown(e);

    //fsw1.EnableRaisingEvents = false;
    //fsw2.EnableRaisingEvents = false;

    System.IO.Directory.Delete("Folder", true);
}

void OnFileSystemItemDeleted(object sender, FileSystemEventArgs e)
{

}

FileSystemWatcher fsw1, fsw2;

0voto

Rustom Aburas Points 17

Actuellement, vous utilisez fsw1 et fsw2 afin de surveiller les données de tout type qui pourraient être supprimées à tout moment.

Bien que je ne voie pas l'intérêt de créer un FSW pour chaque dossier, voici une réponse qui pourrait vous aider :

Afin de surveiller les dossiers eux-mêmes, vous devez créer un FSW pour chaque dossier que vous souhaitez observer.

Vous pouvez ensuite configurer le NotifyFilter du FSW sur DirectoryName comme suit : folderSystemWatcher.NotifyFilter = NotifyFilter.DirectoryName

voir un exemple aquí .

Ainsi, si l'un des FSW vous dit qu'un dossier est supprimé, vous pouvez alors arrêter, éliminer ou faire quoi que ce soit au FSW qui surveille ce dossier supprimé.

Je n'ai pas essayé, mais c'est comme ça que j'aurais fait, je suppose...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X