trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

FileSystemWatcherのChangeイベントって複数回発生するのね

Webカメラが保存する画像ファイルを見張っておいて、その画像ファイルが更新されたタイミングでそのファイルをFTPでアップロードするアプリケーションをざくっと作成した。画像ファイルの変更を見張るのはFileSystemWatcherのChangeイベントを使えば簡単にできると思っていた・・・のだが、このChangeイベントが1度の画像ファイルの更新にもかかわらず、複数回発生するのだった。思わぬところでハマってしまいました。

で、ネットを探すと既知のことで、ファイルを保存するアプリケーションが何度かに分けて書き込むためにChangeイベントが複数発生するのは仕方のないということでした。
でも、だからどうしろ?っていう回答はほとんど無いのね・・・

しょうがないのでChangeイベントが発生してから10秒間は次のChangeイベントが発生しても無視するようにしました。これしかないんじゃないかと思います。

/// <summary>
/// 監視しているファイルが更新された際のイベントハンドラ
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void fswatcher_Changed(object sender, FileSystemEventArgs e)
{
    try
    {
        this.uploading = true;

        FileInfo fi = new FileInfo(e.FullPath);

        //イベントが続けて発生する場合があり、何度もファイルに書き込んでいる可能性があるため、最初のイベントのみアップするようにする。
        if (fi.LastWriteTime.Subtract(lastWriteTimeSav).Seconds < 10)
            return;
               ・
               ・
               ・