2008年02月06日

FileSystemWatcherの不思議

   このエントリーをはてなブックマークに追加 Clip to Evernote
.NET FramworkのFileSystemWatcherクラスを調べていてわかったのですが、メモ帳などのエディタって、保存すると、2回ファイルの更新がおこなわれるんですね。
C#で、

FileSystemWatcher fsw = new FileSystemWatcher(dir);
fsw.Filter = "*.txt";
fsw.NotifyFilter = NotifyFilters.LastWrite;
fsw.IncludeSubdirectories = false;
fsw.Changed += new FileSystemEventHandler(fsw_Changed);
fsw.EnableRaisingEvents = true;


のようなコードを書いて動かしてみたら、なぜか、fsw_Changedが2回走るんです。
プログラムで作成したコードも、2回走ります。
試しに、echoコマンドを使ってみると、

echo ほげほげ > a.txt


だと、2回走ります。

echo ほげほげ >> a.txt


だと、1回でした。
なるほど、推測ですが、

File.WriteAllText("a.txt", "aaaaaa");


というコードは、ファイル作成時と、最後のClose時の2回ファイルシステムにアクセスしているからなんだと思います。

どうしても2回処理したくなければ、連続して発生したイベントを無視するようなコードを書く必要がありそうです。

private string prevfile = "";
private DateTime prevtime = DateTime.Now;

void fsw_Changed(object sender, FileSystemEventArgs e) {
DateTime now = DateTime.Now;
if (now - prevtime < TimeSpan.FromMilliseconds(100) &&
prevfile == e.Name) {
return;
}
prevfile = e.Name;
prevtime = now;
...処理...
}


100という数値には根拠がないので、適当に変更してください。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51389529