none
FileSystemWatcherが動作しない原因がわかりません RRS feed

  • 質問

  • こんにちは。
    3~4年前にWindows7上でFileSystemWatcherを使ってあるフォルダに映像が転送完了したらプレイヤーで再生するというアプリケーションをC#で開発しました。

    しばらくは調子よく動作していたのですが、パナソニックのタフブックCF-C2でそのアプリを使うことになってコピーして起動させたら、FileSystemWatcher関連のイベントが一切発生せず期待通りの動作がしませんでした。

    今まで正常に動作していた実績のあるマシンはWindows7やWindows10のもので普通のWindowsパソコンです。

    ちなみにこのタフブックCF-C2に、Qt5.7フレームワークのC++で開発した似たようなアプリケーションを起動して動作させると正常にイベントが飛んできました。

    タフブックのOSはWindows8.1です。なぜかこのマシンだけC#のFileSystemWatcherが動作しません。

    他の処理が悪さしているのかと思ってFileSystemWatcherの部分だけにしぼったコードにしてもイベントが飛んできません。
    必要なサービスが止まっているのかと思って、正常に動作した実績のあるWindows10マシンのサービスと極力合わせてみてもダメでした。

    これはOSの問題なのかと思ってこのタフブックをWindows10にアップグレードしても変わりませんでした。

    これはマシン固有の問題なんでしょうか?
    C#のFileSystemWatcherの動作を阻害するドライバーとかあるのでしょうか?
    FileSystemWatcher関連の動作に必要な前提とかありますでしょうか?
    同じような経験のある方や、ご存じの方がおりましたらご教授願えればと思います。
    参考までにC#コードの一部を掲載しておきます。

    this.CurrentFileSystemWatcher.Path = txtMovieFolder.Text;

    this.CurrentFileSystemWatcher.EnableRaisingEvents = true;
    this.CurrentFileSystemWatcher.SynchronizingObject = this;
    this.CurrentFileSystemWatcher.Changed += new System.IO.FileSystemEventHandler(this.CurrentFileSystemWatcher_Changed);
    this.CurrentFileSystemWatcher.Created += new System.IO.FileSystemEventHandler(this.CurrentFileSystemWatcher_Created);
    this.CurrentFileSystemWatcher.Renamed += new System.IO.RenamedEventHandler(this.CurrentFileSystemWatcher_Renamed);

    this.CurrentFileSystemWatcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.CreationTime;
    this.CurrentFileSystemWatcher.IncludeSubdirectories = false;

    以上よろしくお願いします。

    2016年10月18日 1:55

すべての返信

  • 正常に機能するマシンと機能しないマシンがあるのであれば、それぞれのマシンで "fltmc" コマンドを実行し、3rd ベンダ製フィルタ ドライバの差異を確認してみては?
    • 回答の候補に設定 星 睦美 2016年10月28日 5:41
    2016年10月18日 2:42
  • FileSystemWatcherクラスは内部的にはWindows APIのReadDirectoryChangesW()を使用しています。仮に後者を使用して動作したのであれば、FileSystemWatcherクラスでも動作するはずです。もし動作しなかったとすると、設定の仕方に問題があるか、動作しているがその後の処理に問題があるかのどちらかではないでしょうか?

    設定の仕方について1点指摘しますと、FileSystemWatcherクラスはISupportInitializeインターフェースを実装していますので、プロパティ・イベント操作の前後でBeginInit() / EndInit()を呼び出すべきです。そうしないとプロパティ等を操作する毎に変更通知の受信・停止を繰り返してしまいます。

    • 回答の候補に設定 星 睦美 2016年10月28日 5:41
    2016年10月18日 2:43
  • ありがとうございました。

    現在対象のタフブックが出張に持って行かれてしまったので戻ってきてから確認してみます。

    また後日報告させていただきます。

    2016年10月19日 0:22
  • ありがとうございました。

    設定の仕方に問題があるとしたらどのパソコンでも動作しないと思うのですが、動作するパソコンと動作しないパソコンが存在するのがややこしくしています。

    対象のタフブックが出張に持って行かれてしまったので、戻ってきてからその後の処理に問題があるのかどうか調査してみます。

    2016年10月19日 0:25