0

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

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 do File.OpenText 以某种方式再次触发该函数时?有任何想法吗?

4

2 回答 2

2

来自MSDN

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

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

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

于 2016-03-27T17:50:50.583 回答
1

解决方案 所以我做了一件小事来控制问题,我添加了一个计数器并始终检查它是否不是第一次,跳过并将其重新分配为 0。

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;
        }
    }
于 2016-03-28T09:18:32.350 回答