FileSystemWatcher“包装器”未触发事件

问题描述 投票:0回答:2

我为FileSystemWatcher创建了包装器类,但是无法触发事件。使用FileSystemWatcher类时,它们按预期方式触发,但不是我的包装器。

任何想法为什么?

public class FolderWatcher
{
    public event FileSystemEventHandler Created;
    public event FileSystemEventHandler Changed;
    private FileSystemWatcher _watcher;

    public FolderWatcher(string watchedFolderPath)
    {
        _watcher = new FileSystemWatcher(watchedFolderPath);
        _watcher.Created += Created;
        _watcher.Changed += Changed;
        _watcher.EnableRaisingEvents = true;
    }
}

class Program
{
    static async Task Main(string[] args)
    {
        string watchedFolder = "/home/user";

        // 1. Custom wrapper for FileSystemWatcher. No events get fired.
        FolderWatcher watcher = new FolderWatcher(watchedFolder);

        // 2. The built in FileSystemWatcher works as expected. Uncomment to test.
        // FileSystemWatcher watcher = new FileSystemWatcher(watchedFolder);
        // watcher.EnableRaisingEvents = true;

        bool createdTriggered = false;
        bool changedTriggered = false;
        bool wait = (changedTriggered == false && createdTriggered == false);

        watcher.Created += (sender, args) => 
        {
            createdTriggered = true;
            Console.WriteLine($"{args.Name} created!");
        };

        watcher.Changed += (sender, args) => 
        {
            changedTriggered = true;
            Console.WriteLine($"{args.Name} changed!");
        };

        Console.WriteLine($"Watching folder {watchedFolder}");

        while (wait)
        {
            await Task.Delay(1);
        }

        Console.WriteLine("Closing application...");
    }
}

[为了测试,我刚刚启动它并创建一个新文件/编辑/home/user中的现有文件。方案1(在代码中注释)不会触发事件,但是方案2(在代码中注释)不会触发事件。我正在努力找出原因。

值得一提的是,我不太喜欢this answer.

c# filesystemwatcher
2个回答
2
投票

而不是尝试将File Watcher的事件挂接到您的事件,而是在捕获File Watcher的事件时仅触发您的事件。

watcher.Changed += (sender, args) => 
{
    if (Created != null)
        Created(sender, args);
}

您的活动在那儿,有人正在使用您的课程上钩。


0
投票

为了简化罗伯特·哈维的答案,只需将构造函数更新为:

    public FolderWatcher(string watchedFolderPath)
    {
        _watcher = new FileSystemWatcher(watchedFolderPath);
        _watcher.Created += (sender, args) => this.Created(sender, args);
        _watcher.Changed += (sender, args) => this.Changed(sender, args);
        _watcher.EnableRaisingEvents = true;
    }
© www.soinside.com 2019 - 2024. All rights reserved.