【问题标题】:c# FileSystemWatcher triggers twice when listening to OnChangedc# FileSystemWatcher 监听 OnChanged 时触发两次
【发布时间】:2018-01-12 02:44:03
【问题描述】:

试图实现FileSystemWatcher,但保存文件时OnChanged函数被调用了两次。根据其他一些帖子,我怀疑LastWrite 过滤器有多个事件?我认为NotifyFilters 会将其限制为仅在写入文件时触发,但其他原因导致函数运行两次。 e.ChangeType 只告诉我文件已更改,但不完全是如何更改的。有没有办法限制它只运行一次?

    public MainWindow()
    {
        InitializeComponent();

        FileSystemWatcher fsw = new FileSystemWatcher(path);
        fsw.NotifyFilter = NotifyFilters.LastWrite;
        fsw.EnableRaisingEvents = true;
        fsw.Changed += new FileSystemEventHandler(OnChanged);
    }

    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        if (newString == null)
        {
            using (StreamReader sr = new StreamReader(new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
            {
                lastString = sr.ReadToEnd();
            }
            difference = lastString;
        } else {
            using (StreamReader sr = new StreamReader(new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)))
            {
                newString = sr.ReadToEnd();
            }
            int newCount = newString.Count();
            int count = lastString.Count();
            // MessageBox.Show("last:" + lastString.Count().ToString(), "next: " + newString.Count());
            difference = newString.Remove(0,5);
            lastString = newString;
        }
        Application.Current.Dispatcher.Invoke(new Action(() => { tb_content.Text = difference; }));
        MessageBox.Show(e.ChangeType.ToString(), "");
    }
}

【问题讨论】:

    标签: c# filesystemwatcher


    【解决方案1】:

    你可以自己过滤掉,我已经发布了here

    【讨论】:

    • 我认为你的网址搞砸了
    • 你只是为了快:)
    • 完美修复。谢谢!
    【解决方案2】:

    Frederik 答案的替代方案:

    想到的一个小解决方法是阻止 OnChanged 方法在已执行时执行。

    例如:

    private bool IsExecuting { get; set; }
    
    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        if (!IsExecuting) 
        {
            IsExecuting = true;
    
            // rest of your code
    
            IsExecuting = false;
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2017-01-08
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多