大容量システムでのファイル変更に関する考慮事項
更新 : 2007 年 11 月
FileSystemWatcher コンポーネントは、膨大な数のイベントを受け取る可能性があります。特に、トラフィックが多いディレクトリを監視するように設定した場合はその可能性が高くなります。FileSystemWatcher コンポーネントは管理しやすい速度でしかイベント通知を受け取れないため、そのような場合には問題が発生する可能性があります。イベントが通知される速度がコンポーネントがそれを受け取る速度を超えている場合、超過した分のイベントはバッファに格納され、その後でコンポーネントに渡されます。コンポーネントは、バッファ内の各エントリをユーザーのコードに発生させるイベントに変換します。このバッファはオーバーフローする可能性があるため、問題の原因となります。ディレクトリ内の変更の数が多すぎてバッファに入りきらない場合、オペレーティング システムは "blanket" 通知を送信し、コンポーネントは例外を発生させます。
![]() |
---|
サービス拒否攻撃は、悪意あるプログラムが FileSystemWatcher コンポーネントの監視対象のディレクトリにアクセスし、そのコンポーネントが管理できないほど多くの変更を生成した場合に成立します。サービス拒否攻撃のリスクを減らすには、このヘルプ トピックの推奨事項に従い、アクセス制御リストを適切に使用します。 |
この問題を避けるには、いくつかのことを実行する必要があります。まず、受け取ることが予想されるイベント数の概算に対して、バッファを適切なサイズに設定します。既定では、バッファのサイズは 4 KB に設定されています。4 KB のバッファは、ディレクトリ内の約 80 ファイルに対する変更を保持できます。各イベントはバッファ内で 16 バイトを使用します。それに加えて、イベントが発生したファイルの名前を Unicode (1 文字あたり 2 バイト) で格納するためのバイト数が必要です。この情報に基づいて、必要なバッファ サイズを見積もることができます。
バッファ サイズを変更するには、[プロパティ] ウィンドウで InternalBufferSize プロパティを設定します。Microsoft Windows 2000 を使用している場合は、バッファ サイズを 4 KB 単位で増やす必要があります。これは、オペレーティング システムの既定のページ サイズに対応しています。他のオペレーティング システムの場合も、そのオペレーティング システムの既定のページ サイズに対応した単位でバッファ サイズを増やす必要があります。
![]() |
---|
使用しているオペレーティング システムの既定のページ サイズが不明な場合、最も安全な方法は元のバッファ サイズを単純に 2 倍にすることです。これにより、オペレーティング システムのために必要とされる元の間隔を維持できます。 |
適切なバッファ サイズを設定する他に、次の 3 つのプロパティを使用して、バッファに格納される情報の量を制御することもできます。
NotifyFilter プロパティを使用して、FileSystemWatcher コンポーネントが監視対象ディレクトリ内のすべての変更を監視するか、または指定された変更だけを監視するかを決定します。
IncludeSubdirectories プロパティを使用して、監視対象のディレクトリにサブディレクトリを含めるかどうかを決定します。サブディレクトリを含める必要がない場合は、このプロパティをオフにすると、オンにした場合よりも受け取るイベントが少なくなります。
Changed イベントを監視するように FileSystemWatcher コンポーネントを設定している場合は、NotifyFilter プロパティを使用して、必要なイベントだけを指定できます。
メモ :
Filter プロパティでも監視対象のファイルまたはサブディレクトリを指定できますが、このプロパティはバッファに変更が追加された後で適用されるため、バッファ サイズは減少しません。その代わりに、NotifyFilter プロパティを使用して、バッファに書き込まれる情報の量を制御できます。
参照
処理手順
方法 : FileSystemWatcher コンポーネントのインスタンスを設定する