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)
            {
            }
        }
    }

だから、ストリームリーダーが File.OpenText を実行すると、ループで推測しています。何か案は?

4

2 に答える 2

2

MSDNから:

Changed イベントは、サイズ、システム属性、最終書き込み時刻、最終アクセス時刻などに変更が加えられると発生します。

そうです、ファイルを開く (実際には閉じる) と、Changed イベントが再び発生します。

NotifyFilterを使用して、ウォッチャーがトリガーするアクションを制限できます。

于 2016-03-27T17:50:50.583 に答える
1

解決策 そこで、問題を制御する小さなことを 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 に答える