onChanged里面的streamReader会发射两次?

时间:2016-03-27 17:41:15

标签: c# onchange streamreader filesystemwatcher opentext

我有一个小应用程序,它监视一个特定的文件,每当它发生变化时,我的应用程序应该在循环中执行操作,但有些东西会不止一次触发该函数!这是我的代码

private void OnChanged(object source, FileSystemEventArgs e)
    {
        if (e.FullPath == @"C:\test.txt")
        {
            string textFilePath = @"C:\test.txt";

            try
            {
                using (var streamReader = File.OpenText(textFilePath))
                {
                    var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                    foreach (var line in lines)
                    {
                        //actions here
                    }
                }
            }
            catch (Exception)
            {
            }
        }
    }

所以当我在Streamreader做File.OpenText以某种方式再次触发该函数时,我在循环中猜测?!任何想法?

2 个答案:

答案 0 :(得分:2)

来自MSDN

  

当对大小,系统属性,上次写入时间,上次访问时间进行更改时,会引发Changed事件,...

所以是的,打开(实际上:关闭)文件将再次引发Changed事件。

您可以使用NotifyFilter来限制观察者触发的操作。

答案 1 :(得分:1)

<强>解 所以我做了一个控制问题的小事,我添加了一个计数器,并且总是检查它是不是第一次,跳过并重新分配给它。

private int fireCounter = 0;

    private void OnChanged(object source, FileSystemEventArgs e)
    {
        fireCounter++;

        if (fireCounter == 1)
        {
            delete();

            if (e.FullPath == @"C:\test.txt")
            {
                Thread.Sleep(2000);
                //I added Sleep for two seconds because without it sometimes it wont work

                string textFilePath = @"C:\test.txt";
                try
                {
                    using (var streamReader = File.OpenText(textFilePath))
                    {
                        var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                        foreach (var line in lines)
                        {
                            //Actions Here
                        }
                    }
                }
                catch (Exception)
                {
                }
            }
        }
        else
        {
            fireCounter = 0;
        }
    }