PhysicalFilesWatcher 驗證 root 與 FileSystemWatcher 路徑

PhysicalFilesWatcher 建構函式現在會驗證 root 引數,以及 root 和 FileSystemWatcher.Path 之間的關係。 先前在施工時被接受的無效組合,現在會拋出例外。

所推出的版本

.NET 11 預覽版 4

以前的行為

先前,PhysicalFilesWatcher 建構函式會直接儲存提供的 root,而不進行驗證或正規化處理。 null 或其他無效的根可能會在建構時被接受,並在後續的監視器操作期間失敗。

這些建構函式也接受一個 FileSystemWatcher,其非空的 Path 與 root 無關。 這樣的監視者通常無法回報與配置根相關的變更,但不匹配不會讓建構子丟棄。

例如,下列建構成功了:

string root = Path.Combine(Path.GetTempPath(), "root");
string unrelatedPath = Path.Combine(Path.GetTempPath(), "unrelated");
Directory.CreateDirectory(root);
Directory.CreateDirectory(unrelatedPath);

using var fileSystemWatcher = new FileSystemWatcher(unrelatedPath);
using var watcher = new PhysicalFilesWatcher(
    root,
    fileSystemWatcher,
    pollForChanges: false);

新行為

從 .NET 11 開始,PhysicalFilesWatcher 建構函式會藉由呼叫 root 來正規化 Path.GetFullPath(),並在建構時拒絕無效的輸入:

  • 若 root 是 null,構造子拋 ArgumentNullException出 。
  • 如果 root 無法轉換為完整路徑,建構函式會傳遞 Path.GetFullPath() 所引發的適用例外狀況。
  • 若 FileSystemWatcher.Path 非空且與 root無關,則構造子拋 ArgumentException出 。

FileSystemWatcher.Path 在為空、其值等於 root、是 root 的祖先,或是 root 的後代時有效。 在前一個例子中,構造 現在拋棄 ArgumentException ,因為 unrelatedPath 既不是 的 root祖先也不是後代。

一個尚未存在的根目錄仍然有效。 檔案監看會延後至根目錄建立後才開始。

破壞性變更的類型

此變更為行為變更。

變更原因

PhysicalFilesWatcher 現在支援在建構監視器時不存在的根節點。 這需要將根正規化,並使所提供的 FileSystemWatcher 與該根相協調。

監控無關目錄的 A FileSystemWatcher 無法可靠地為已設定的根目錄產生通知。 在建構時拒絕這種無效的組合,可避免在通常無法正常運作的組態下建立監看器。 對根目錄進行驗證也會讓無效路徑立即失敗,而不是等到後續的監看器作業時才失敗。 更多資訊請參見 dotnet/runtime#126411。

將一條非空且有效的路徑傳遞為 root。

當你提供具有非空 Path 的 FileSystemWatcher 時,請將其路徑設定為等於 root、為 root 的祖先,或為 root 的子孫。 例如:

string root = Path.GetFullPath(configuredRoot);

using var fileSystemWatcher = new FileSystemWatcher(root);
using var watcher = new PhysicalFilesWatcher(
    root,
    fileSystemWatcher,
    pollForChanges: false);

如果根目錄還不存在,則 FileSystemWatcher.Path 空位是有效的:

string root = Path.GetFullPath(configuredRoot);

using var fileSystemWatcher = new FileSystemWatcher();
using var watcher = new PhysicalFilesWatcher(
    root,
    fileSystemWatcher,
    pollForChanges: false);

監控者會在建立根目錄後開始監控。

受影響的 API