共用方式為


高容量系統的檔案變更考量

更新:2007 年 11 月

您的 FileSystemWatcher 元件可能會收到大量的事件,特別是若您設定它來監看流量非常高的目錄。這可能會造成問題,因為 FileSystemWatcher 元件只能在可管理的情況下接收事件告知。如果傳入的事件超過元件可接收的事件,則會將超出的事件儲存在緩衝區中,接著再傳遞至元件。元件會將緩衝區中的每個項目轉譯為在使用者程式碼中引發的事件。這個緩衝區會因溢位而產生問題。如果目錄中的變更次數過多而使緩衝區無法容納時,作業系統會發出「適用於所有情況」的告知,而元件將引發例外狀況。

安全性注意事項:

如果惡意程式取得 FileSystemWatcher 元件監視之目錄的存取權,並產生許多元件無法管理的變更,就有可能發生拒絕服務攻擊。遵循這個 [說明] 頁面中的建議,然後適當地使用存取控制清單,以降低拒絕服務攻擊的風險。

若要避免這個問題發生,您應照著以下步驟做。首先,您應依據您預期收到的事件數量將緩衝區設定為適當的大小。依預設,緩衝區是設定為 4 KB 的大小。4 KB 的緩衝區可追蹤目錄中約 80 個檔案的變更。每個事件佔緩衝區 16 個位元組,加上需要足夠的位元組來儲存事件發生所在檔案的名稱 (Unicode 格式,每個字元需 2 個位元組)。您可以使用以上資訊來估計您將需要的緩衝區大小。

您可以在 [屬性] 視窗中設定 InternalBufferSize 屬性 (Property),重設緩衝區大小。如果您使用 Microsoft Windows 2000,您應以 4 KB 為單位來遞增緩衝區大小,因為這會對應到作業系統的預設分頁大小。至於其他作業系統,您應以與作業系統的預設分頁大小對應的單位來遞增緩衝區大小。

秘訣

如果您不確定所使用之作業系統預設的分頁大小,最安全的做法是將原始的緩衝區大小加倍。這將保持您作業系統所需的原始間隔。

除了設定適當的緩衝區大小之外,您還可以使用下列三個屬性來控制緩衝區接收的資訊量:

  • 使用 NotifyFilter 屬性,來決定 FileSystemWatcher 元件是要尋找監看目錄中的所有變更,還是只有特定變更。

  • 使用 IncludeSubdirectories 屬性,來決定是否也要包含監看目錄中的子目錄。如果您在不需要時關閉它,則您會比開啟它時收到較少的事件。

  • 如果您將 FileSystemWatcher 元件設定為監看 Changed 事件,那麼可以使用 NotifyFilter 屬性來指定只要監看哪些事件。

    注意事項:

    雖然您也可以使用 Filter 屬性來指定所要監看的檔案或子目錄,但這個屬性是在變更加入至緩衝區後才會套用,而且完全不會減少緩衝區的大小。請使用 NotifyFilter 屬性來代替控制寫入緩衝區的資訊量。

請參閱

工作

HOW TO:設定 FileSystemWatcher 元件執行個體

概念

監視檔案系統事件簡介