none
指定したディレクトリ内のファイルの変更を把握したい RRS feed

  • 質問

  • 指定したディレクトリ内のファイルが変更されたことを把握するために FileSystemWatcherでファイルの変更を監視しています。
    Windows Server 2003 では問題なく監視できますが、NAS(Tera Station)では13分程度で変更のイベントが発生しなくなってしまいます。
    また、イベントが発生しない状態になってしまうと、そのコンピュータから指定したディレクトリにアクセスしようとすると表示までに非常に時間がかかります。(これまで最大で1分30秒ほどかかる場合があります。)
    NASの場合は、Windows Serverとは異なる処理が必要なのかと考えていますが、今のところ原因がつかめていません。
    考えられる原因、およびディレクトリ内のファイルの変更を監視する他の手法がありましたらアドバイス願います。

    開発環境は Visual Studio 2005 VC# です。

    参考までに、現在テストしているコードを以下に記載します。
    --------------------------------------------------------
                folderwatcher = new System.IO.FileSystemWatcher();

                bool bFolderEx = false;
                string strWatchingFAXDirectoryName;

                try
                {
                    strWatchingFAXDirectoryName = strFAXPath + @"\" + faxnumberArray;

                    bFolderEx = Directory.Exists(strWatchingFAXDirectoryName);
                    if (bFolderEx == true)
                    {
                        folderwatcher.Path = strWatchingFAXDirectoryName;

                        //最終アクセス日時、最終更新日時、ファイル、フォルダ名の変更を監視する
                        folderwatcher.NotifyFilter = (System.IO.NotifyFilters.LastAccess |
                                                    System.IO.NotifyFilters.LastWrite |
                                                    System.IO.NotifyFilters.FileName |
                                                    System.IO.NotifyFilters.DirectoryName);
                        //tifファイルを監視
                        folderwatcher.Filter = "*.tif";
                        folderwatcher.SynchronizingObject = this;

                        //イベントハンドラの追加
                        folderwatcher.Changed += new System.IO.FileSystemEventHandler(folderwatcher_Changed);
                        folderwatcher.Created += new System.IO.FileSystemEventHandler(folderwatcher_Changed);
                        folderwatcher.Deleted += new System.IO.FileSystemEventHandler(folderwatcher_Changed);
                        folderwatcher.Renamed += new System.IO.RenamedEventHandler(folderwatcher_Renamed);

                        //監視を開始する
                        folderwatcher.EnableRaisingEvents = true;
                        timerFAXWatching.Enabled = true;
                    }
                }
                catch (Exception ex)
                {
                    folderwatcher = null;
                    System.Diagnostics.Debut.WriteLine(String.Format("FolderWatcherStart->Error!", ex.Message));
                }
    --------------------------------------------------------

    以上、お手数をお掛けしますがよろしくお願いします。


    マンモス
    2011年9月21日 0:54

回答

  • 機器側の実装によることでは?
    もしかしたら、その機器の OS、ソフトウェアに不具合があってうまく動作しないのかもしれません。
    メーカーに問い合わせてみるのも一手ではないでしょうか。

    メーカーが回答しなかった場合、手探りで回避策を探すしかありません。
    その場合、一般的な解決方法というものではなくなるので、それを研究したことがある人はいるかどうか…。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2011年10月14日 8:17
    • 回答としてマーク マンモス 2011年10月18日 4:54
    2011年9月21日 13:31
    モデレータ
  • NAS というと、Network Attached Storage ですか。これに使われている、ファイル共有のためのサーバーは、何でしょうね?Linux 系の OS では Samba が使われていると思いますので「FileSystemWatcher samba」で検索すると・・・これなんか近いのではないでしょうか。

    Using samba volume with C# FileSystemWatcher class

    私は C# で、そのリモートディレクトリのコンテンツに対する変更を監視するための小さいアプリケーション(Visual Studio 2003)を書きました。C: ドライブ(私のPCのローカル ディスク)を見るなら、アプリケーションは C: ドライブでのファイルに対する変更について正常に知らせます。しかしながら、T: ドライブを見るようにコードを書き換えると、アプリは T: ドライブでのディレクトリ内容に対する変更のいずれも検出しません。

    Samba は、現在のレベルでは、監視しているディレクトリに対して*のみ*、(何らかのファイル システムの通知である)ChangeNotify をサポートします。現在、更新を検出するとき、「とにかく何かが変えられた」メッセージを生成します。 Samba を(Linux の具体的な機能である) inotify と統合するまで、これは私たちがすることができる最も良いものです。理由は POSIX でその作業をする容易な方法がないということです。 それは信じられないほど高額なオペレーションです。

    2008年のものですが、2011年6月のものも、同じような回答です(参考)。


    Jitta@わんくま同盟
    • 回答の候補に設定 山本春海 2011年10月14日 8:17
    • 回答としてマーク マンモス 2011年10月18日 4:54
    2011年9月26日 12:06

すべての返信

  • 機器側の実装によることでは?
    もしかしたら、その機器の OS、ソフトウェアに不具合があってうまく動作しないのかもしれません。
    メーカーに問い合わせてみるのも一手ではないでしょうか。

    メーカーが回答しなかった場合、手探りで回避策を探すしかありません。
    その場合、一般的な解決方法というものではなくなるので、それを研究したことがある人はいるかどうか…。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2011年10月14日 8:17
    • 回答としてマーク マンモス 2011年10月18日 4:54
    2011年9月21日 13:31
    モデレータ
  • NAS というと、Network Attached Storage ですか。これに使われている、ファイル共有のためのサーバーは、何でしょうね?Linux 系の OS では Samba が使われていると思いますので「FileSystemWatcher samba」で検索すると・・・これなんか近いのではないでしょうか。

    Using samba volume with C# FileSystemWatcher class

    私は C# で、そのリモートディレクトリのコンテンツに対する変更を監視するための小さいアプリケーション(Visual Studio 2003)を書きました。C: ドライブ(私のPCのローカル ディスク)を見るなら、アプリケーションは C: ドライブでのファイルに対する変更について正常に知らせます。しかしながら、T: ドライブを見るようにコードを書き換えると、アプリは T: ドライブでのディレクトリ内容に対する変更のいずれも検出しません。

    Samba は、現在のレベルでは、監視しているディレクトリに対して*のみ*、(何らかのファイル システムの通知である)ChangeNotify をサポートします。現在、更新を検出するとき、「とにかく何かが変えられた」メッセージを生成します。 Samba を(Linux の具体的な機能である) inotify と統合するまで、これは私たちがすることができる最も良いものです。理由は POSIX でその作業をする容易な方法がないということです。 それは信じられないほど高額なオペレーションです。

    2008年のものですが、2011年6月のものも、同じような回答です(参考)。


    Jitta@わんくま同盟
    • 回答の候補に設定 山本春海 2011年10月14日 8:17
    • 回答としてマーク マンモス 2011年10月18日 4:54
    2011年9月26日 12:06
  • Azuleanさん、Jittaさん、ご回答ありがとうございました。

    NASではLinuxのSambaが使われていますので、アドバイスいただいた通りだと考えられます。
    大変参考になりました。


    マンモス
    2011年10月18日 4:55