
C# Visual Studio 2017でファイルを監視するプログラムを作成したいと考えております。
FilteSystemWatcherクラスを使用することで特定のファイルを監視し、イベントを発生させることができるとのことで、サンプルコードを動かしてみました。
確かにファイルを変更することでイベントは発生しましたが、イベントが2回派生してしまいます。
なぜ2回イベントが発生するのかを調べたところ、ファイルの変更方法でイベントが2回発生してしまうそうです。
ファイルの変更方法はプログラム内のStreamWriter(FilePath,False)で内容をすべて書き換えています。
私のようなファイルの変更方法ではイベントが2回発生してしまうのでしょうか?
また、イベントが1回しか発生しない書き換え方が他にあるのでしょうか?
ファイル監視のコード
C#
1public void StartWatching() { 2 Watcher = new FileSystemWatcher(); 3 4 //監視するパス 5 Watcher.Path = @"C:\usr"; 6 7 //ファイル名と最終書き込み時間 8 Watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName; 9 10 //フィルタで監視するファイルを.txtのみにする 11 Watcher.Filter = "*.txt"; 12 13 //サブディレクトリ以下も監視するか 14 Watcher.IncludeSubdirectories = false; 15 16 //変更発生時のイベントを定義する 17 Watcher.Created += Changed; 18 Watcher.Changed += Changed; 19 Watcher.Deleted += Changed; 20 Watcher.Renamed += Changed; 21 22 //監視開始 23 Watcher.EnableRaisingEvents = true; 24 25 //必要がなくなったら監視終了(StopWatching)を呼ぶ 26 } 27 28 //ファイル監視ストップ 29 public void StopWatching() { 30 Watcher.EnableRaisingEvents = false; 31 Watcher.Dispose(); 32 } 33 34 //ファイル変更イベント 35 public void Changed(object source, FileSystemEventArgs e) { 36 switch (e.ChangeType) { 37 38 case WatcherChangeTypes.Created: 39 Console.WriteLine($"新規作成: {e.FullPath}"); 40 break; 41 42 case WatcherChangeTypes.Deleted: 43 Console.WriteLine($"削除: {e.FullPath}"); 44 break; 45 46 case WatcherChangeTypes.Changed: 47 //ここのイベントが2回発生してしまう 48 Console.WriteLine($"変更: {e.FullPath}"); 49 break; 50 51 case WatcherChangeTypes.Renamed: 52 Console.WriteLine($"リネーム: {e.FullPath}"); 53 break; 54 } 55 }
ファイル書き換えのコード
C#
1public async Task SensorChangeAsync(int i) { 2 await Task.Run(() => { 3 //書き換える文字列を作成 4 string[] Set = File.ReadAllLines(FilePath, Encoding.Default); 5 Set[i - 1] = String.Format("Sensor_{0},OFF,N", i); 6 //書き換えの部分 7 using (StreamWriter sw = new StreamWriter(FilePath, false)) { 8 foreach (string str in Set) { 9 sw.WriteLine(str); 10 } 11 } 12 }); 13 }

回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。