PhysicalFilesWatcher がルートパスと FileSystemWatcher パスを検証する

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