トップ回答者
指定したディレクトリ内のファイルの変更を把握したい

質問
-
指定したディレクトリ内のファイルが変更されたことを把握するために 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));
}
--------------------------------------------------------以上、お手数をお掛けしますがよろしくお願いします。
マンモス
回答
-
機器側の実装によることでは?
もしかしたら、その機器の OS、ソフトウェアに不具合があってうまく動作しないのかもしれません。
メーカーに問い合わせてみるのも一手ではないでしょうか。メーカーが回答しなかった場合、手探りで回避策を探すしかありません。
その場合、一般的な解決方法というものではなくなるので、それを研究したことがある人はいるかどうか…。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -
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@わんくま同盟
すべての返信
-
機器側の実装によることでは?
もしかしたら、その機器の OS、ソフトウェアに不具合があってうまく動作しないのかもしれません。
メーカーに問い合わせてみるのも一手ではないでしょうか。メーカーが回答しなかった場合、手探りで回避策を探すしかありません。
その場合、一般的な解決方法というものではなくなるので、それを研究したことがある人はいるかどうか…。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。 -
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@わんくま同盟