PhysicalFilesWatcher valide les chemins racine et FileSystemWatcher

PhysicalFilesWatcher les constructeurs valident maintenant l’argument root et la relation entre root et FileSystemWatcher.Path. Les combinaisons non valides précédemment acceptées au moment de la construction lèvent désormais une exception.

Version introduite

.NET 11 Preview 4

Comportement antérieur

Auparavant, les PhysicalFilesWatcher constructeurs stockaient l’élément fourni root sans validation ni normalisation. Une racine null ou autrement non valide peut être acceptée lors de l’instanciation et provoquer un échec lors d’une opération de surveillance ultérieure.

Les constructeurs ont également accepté un FileSystemWatcher dont le Path non vide n’était pas lié à root. En général, un tel observateur ne pouvait pas signaler les changements pertinents pour la racine configurée, mais ce décalage n’amenait pas le constructeur à lever une exception.

Par exemple, la construction suivante a réussi :

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

Nouveau comportement

À compter de .NET 11, les constructeurs PhysicalFilesWatcher normalisent root en appelant Path.GetFullPath() et rejettent les entrées non valides lors de la construction :

  • Si root est null, le constructeur génère ArgumentNullException.
  • Si root ne peut pas être converti en chemin complet, le constructeur propage l’exception appropriée levée par Path.GetFullPath().
  • Si FileSystemWatcher.Path n’est pas vide et n’a aucun lien avec root, le constructeur lève ArgumentException.

FileSystemWatcher.Path est valide lorsqu’il est vide, égal à root, un ancêtre de root, ou un descendant de root. Dans l’exemple précédent, la construction déclenche désormais ArgumentException car unrelatedPath n’est ni un ancêtre ni un descendant de root.

Un répertoire racine qui n’existe pas encore reste valide. La surveillance des fichiers est différée jusqu’à ce que la racine soit créée.

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

PhysicalFilesWatcher prend désormais en charge les racines qui n’existent pas lorsque l’observateur est construit. Cela nécessite la normalisation de la racine et la coordination d’un FileSystemWatcher fourni avec cette racine.

Un FileSystemWatcher répertoire qui surveille un répertoire non lié ne peut pas produire de notifications de manière fiable pour la racine configurée. Le rejet de cette combinaison non valide au moment de la construction empêche la création d’un observateur dans une configuration qui ne fonctionnait généralement pas. La validation de la racine fait également échouer immédiatement les chemins d’accès non valides, au lieu d’échouer lors d’une opération de surveillance ultérieure. Pour plus d’informations, consultez dotnet/runtime#126411.

Indiquez un chemin valide et non nul pour root.

Lorsque vous fournissez un FileSystemWatcher avec un Path non vide, configurez son chemin d’accès de sorte qu’il soit égal à root, qu’il soit un ancêtre de celui-ci ou l’un de ses descendants. Par exemple:

string root = Path.GetFullPath(configuredRoot);

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

Si le répertoire racine n’existe pas encore, un répertoire vide FileSystemWatcher.Path est valide :

string root = Path.GetFullPath(configuredRoot);

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

L’observateur commence à surveiller une fois le répertoire racine créé.

API affectées