PhysicalFilesWatcher valideert root- en FileSystemWatcher-paden

PhysicalFilesWatcher constructors valideren nu het root argument en de relatie tussen root en FileSystemWatcher.Path. Ongeldige combinaties die eerder werden geaccepteerd tijdens de bouw, genereren nu een uitzondering.

Geïntroduceerde versie

.NET 11 preview 4

Vorig gedrag

Voorheen hebben de PhysicalFilesWatcher constructors de opgegeven root zonder validatie of normalisatie opgeslagen. Een null of anderszins ongeldige root kan tijdens de bouw worden geaccepteerd en mislukken tijdens een latere watcherbewerking.

De constructors accepteerden ook een FileSystemWatcher waarvan de niet-lege Path geen verband hield met root. Een dergelijke watcher zou over het algemeen geen wijzigingen kunnen rapporteren die relevant zijn voor de geconfigureerde hoofdmap, maar die mismatch zorgde er niet voor dat de constructor een uitzondering opwierp.

De volgende constructie is bijvoorbeeld geslaagd:

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);

Nieuw gedrag

Vanaf .NET 11 normaliseren de constructors van rootPhysicalFilesWatcher door Path.GetFullPath() aan te roepen en wijzen ze ongeldige invoer tijdens de constructie af:

  • Als rootnull is, genereert de constructor ArgumentNullException.
  • Als root niet kan worden geconverteerd naar een volledig pad, geeft de constructor de toepasselijke uitzondering uit Path.GetFullPath() door.
  • Als FileSystemWatcher.Path niet leeg is en geen verband houdt met root, werpt de constructor ArgumentException.

FileSystemWatcher.Path is geldig wanneer het leeg is, gelijk aan root, een voorouder van rootof een afstammeling van root. In het vorige voorbeeld veroorzaakt de constructie nu ArgumentException, omdat unrelatedPath noch een voorouder noch een afstammeling van root is.

Een basismap die nog niet bestaat, blijft geldig. Het monitoren van bestanden wordt uitgesteld totdat de hoofdmap is aangemaakt.

Type van brekende verandering

Deze wijziging is een gedragswijziging.

Reden voor wijziging

PhysicalFilesWatcher ondersteunt nu roots die niet bestaan wanneer de watcher is gebouwd. Dit vereist normalisatie van de root en coördinatie van een opgegeven FileSystemWatcher met die root.

Een FileSystemWatcher die een niet-verwante map bewaakt, kan niet betrouwbaar meldingen genereren voor de geconfigureerde hoofdmap. Als u deze ongeldige combinatie tijdens de bouw afwijst, voorkomt u dat een watcher wordt gemaakt in een configuratie die over het algemeen niet werkte. Validatie van de hoofdmap zorgt er ook voor dat ongeldige paden direct mislukken in plaats van pas tijdens een latere bewerking van de watcher. Zie dotnet/runtime#126411 voor meer informatie.

Geef een niet-null, geldig pad door als root.

Wanneer u een FileSystemWatcher met een niet-lege Path opgeeft, configureer het pad zo dat het gelijk is aan, een voorouder is van of een afstammeling is van root. Voorbeeld:

string root = Path.GetFullPath(configuredRoot);

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

Als de hoofdmap nog niet bestaat, is een lege FileSystemWatcher.Path map geldig:

string root = Path.GetFullPath(configuredRoot);

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

De watcher begint met controleren nadat de hoofdmap is aangemaakt.

Betreffende API's