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);
監控者會在建立根目錄後開始監控。