PhysicalFilesWatcher コンストラクターは、 root 引数と root と FileSystemWatcher.Pathの関係を検証するようになりました。 これまでは構築時に受け入れられていた無効な組み合わせは、例外をスローするようになりました。
導入されたバージョン
.NET 11 Preview 4
以前の動作
以前は、 PhysicalFilesWatcher コンストラクターは、検証や正規化を行わずに、指定された root を格納しました。
nullまたはその他の無効なルートは、構築時に受け入れられ、後の監視操作中に失敗する可能性があります。
また、コンストラクターは、空でない Path が root とは無関係な FileSystemWatcher も受け入れていました。 このようなウォッチャーは、通常、構成されたルートに関連する変更を報告できませんでしたが、不一致によってコンストラクターがスローされませんでした。
たとえば、次の構築に成功しました。
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 コンストラクターは、Path.GetFullPath()を呼び出してrootを正規化し、構築時に無効な入力を拒否します。
-
rootがnullの場合、コンストラクターはArgumentNullExceptionをスローします。 -
root完全なパスに変換できない場合、コンストラクターは該当する例外をPath.GetFullPath()から伝達します。 -
FileSystemWatcher.Pathが空でなく、rootとは無関係な場合、コンストラクターはArgumentExceptionをスローします。
FileSystemWatcher.Path は、空であるか、root と等しいか、root の祖先であるか、または root の子孫である場合に有効です。 前の例では、root が ArgumentException の祖先でも子孫でもないため、構築時に unrelatedPath がスローされるようになりました。
まだ存在しないルート ディレクトリは有効なままです。 ファイル監視は、ルートが作成されるまで遅延されます。
破壊的変更の種類
この変更は 動作の変更です。
変更理由
PhysicalFilesWatcher では、ウォッチャーが構築されるときに存在しないルートがサポートされるようになりました。 これには、ルートの正規化と、そのルートとの提供された FileSystemWatcher の調整が必要です。
関係のないディレクトリを監視する FileSystemWatcher は、構成されたルートの通知を確実に生成できません。 構築時にこの無効な組み合わせを拒否すると、通常は機能しない構成でウォッチャーが作成されなくなります。 また、ルートを検証することで、無効なパスは後続のウォッチャー操作時ではなく、その場で無効と判定されます。 詳細については、「 dotnet/runtime#126411」を参照してください。
推奨されるアクション
null 以外の有効なパスを rootとして渡します。
空でないPathを持つFileSystemWatcherを指定する場合は、そのパスを、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
.NET