背景FileSystemWatcherは、ネットワーク共有に利用可能なファイルを報告しますが、ファイルが見つかりません
私は4つのサブフォルダを共有フォルダ\\Server\Share
を持つサーバーあります
- OutboundFinal
- OutboundStaging
- をInboundFinal
- InboundStaging
すべてのフォルダは同じ物理ディスクとパーティションに存在し、接合点は使用されません。
また、この共有にファイルを書き込み、読み込む複数のWinFormsクライアント(最大10個)があり、各クライアントは複数のスレッド(最大5個)で作業しています。ファイルは\\Server\Share\OutboundStaging
フォルダにクライアント(最大50個のスレッド)によって書き込まれます。各ファイルにはGUIDの名前があるため、上書きはありません。ファイルが完全に書き込まれると、そのファイルはクライアントによって\\Server\Share\OutboundFinal
フォルダーに移動されます。同じサーバー上で実行されているWindowsサービスは、それを取り出して削除し、処理した後、同じ名前のファイルを\\Server\Share\InboundStaging
フォルダに書き込みます。ファイルが完全に書き込まれると、サービスによって\\Server\Share\InboundFinal
フォルダーに移動されます。
この\\サーバー\共有\ InboundFinalフォルダが特定のスレッドが\サーバー\共有に見ることを期待ファイルのGUIDのファイル名に設定されているFileSystemWatcher.WaitForChanged(WatcherChangeTypes.Changed | WatcherChangeTypes.Created, timeOut);
FileSystemWatcher.Filter
を使用して、各WinFormsのクライアントの各スレッドによって監視されている\ InboundFinalフォルダに格納されているため、FileSystemWatcherはフォルダ内に特定のファイルが表示されるまで待機します。
FileSystemWatcher
について、いくつかの質問を読んで、UNCシェアの変更を報告していません。しかしこれは私の場合ではありません。
FileSystemWatcher fileWatcher = new FileSystemWatcher();
fileWatcher.Path = InboundFinalFolder;
fileWatcher.Filter = GUIDFileName; // contains full UNC path AND the file name
fileWatcher.EnableRaisingEvents = true;
fileWatcher.IncludeSubdirectories = false;
var res = fileWatcher.WaitForChanged(WatcherChangeTypes.Changed | WatcherChangeTypes.Created, timeOut);
if (!fileWatcher.TimedOut)
{
using (FileStream stream = fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) {
byte[] res = new byte[stream.Length];
stream.Read(res, 0, stream.Length);
return res;
}
それが例外をスロー用いたラインです:
私が使用するコードは次のようになります。
PROBLEM
私はfileWatcher.WaitForChangedが適切なGUIDの名前のファイルが\\Server\Share\InboundFinal
フォルダ内にある場合にのみに行くだろうことを前提としています。これは、FileSystemWatcherがローカルフォルダでどのように動作するのか、ネットワークを介してアクセスされるファイル共有(ローカルファイルは共有を介してアクセスされた場合でも動作する傾向があります)では動作しません。 FileSystemWatcherは、スレッドが待機しているファイルがFileSystemWatcher \\Server\Share\InboundFinal
フォルダにあることを報告します。しかし、ファイルを読み込もうとすると、FileNotFoundExceptionが発生します。読み取りスレッドは、ファイルが読み取られるまで3〜15秒待たなければなりません。私はRead
共有のFileStreamでファイルを開こうとします。
この現象の原因は何ですか?どのように私はそれを回避するのですか?理想的には、FileSystemWatcher.WaitForChanged(WatcherChangeTypes.Changed | WatcherChangeTypes.Created, timeOut);
は、ファイルの読み取りが可能な場合やタイムアウトが発生した場合にのみ実行を継続する必要があります。
FileNotFoundExceptionはかなり基本的です。標準的な間違いは、ファイルを開くためにGUIDFileNameを使用することです。十分ではありませんが、完全なパスではありません。テスト時には偶然に動作し、サーバー上では動作しません。また、アンチマルウェアを無効にして試してみてください。スキャンしている間にファイルを隠していると思われる場合に備えて、これをお勧めします。あなたは実際に失敗したコードを投稿しなかったので、これらは推測です。 –
GUIDFileNameプロパティには、完全なUNCパスとGUIDファイル名が含まれています。申し訳ありませんが、私は私の質問でコードスニペットを編集して明確にしました。 – Daniel
例外をスローするのは** usingの** lineです。 – Daniel