PhysicalFilesWatcher valida os caminhos de raiz e do FileSystemWatcher

PhysicalFilesWatcher Os construtores agora validam o root argumento e a relação entre root e FileSystemWatcher.Path. Combinações inválidas que antes eram aceites durante a construção agora geram uma exceção.

Versão introduzida

.NET 11 Prévia 4

Comportamento anterior

Anteriormente, os PhysicalFilesWatcher construtores armazenavam o fornecido root sem validação ou normalização. Uma raiz null ou de outra forma inválida pode ser aceite no momento da construção e falhar numa operação posterior do watcher.

Os construtores também aceitavam um FileSystemWatcher cujo Path não vazio não tinha relação com root. Um observador assim geralmente não podia reportar alterações relevantes para a raiz configurada, mas o desajuste não causava o lançamento do construtor.

Por exemplo, a seguinte construção teve sucesso:

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

Novo comportamento

A partir do .NET 11, os PhysicalFilesWatcher construtores normalizam root chamando Path.GetFullPath() e rejeitando entradas inválidas em tempo de construção:

  • Se root é null, o construtor lança ArgumentNullException.
  • Se root não puder ser convertido para um caminho completo, o construtor propaga a exceção aplicável de Path.GetFullPath().
  • Se FileSystemWatcher.Path for não vazio e não estiver relacionado com root, o construtor lança ArgumentException.

FileSystemWatcher.Path é válido quando é vazio, igual a root, um antepassado de root, ou um descendente de root. No exemplo anterior, a construção agora gera ArgumentException porque unrelatedPath não é nem ascendente nem descendente de root.

Um diretório raiz que ainda não existe mantém-se válido. A monitorização de ficheiros é adiada até que o diretório raiz seja criado.

Tipo de mudança disruptiva

Esta mudança é uma mudança comportamental.

Motivo da mudança

PhysicalFilesWatcher Agora suporta raízes que não existem quando o Watcher é construído. Isto requer a normalização da raiz e a coordenação de um FileSystemWatcher fornecido com essa raiz.

Um FileSystemWatcher que monitoriza um diretório não relacionado não consegue produzir notificações de forma fiável para a raiz configurada. Rejeitar esta combinação inválida no momento da construção impede que um observador seja criado numa configuração que geralmente não funcionava. A validação da raiz também faz com que caminhos inválidos falhem imediatamente, em vez de durante uma operação de observador posterior. Para mais informações, consulte dotnet/runtime#126411.

Passe um caminho válido e não nulo como root.

Quando fornecer um(a) FileSystemWatcher com um(a) Path não vazio(a), configure o respetivo caminho para ser igual a root, um ancestral de root ou um descendente de root. Por exemplo:

string root = Path.GetFullPath(configuredRoot);

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

Se o diretório raiz ainda não existir, um vazio FileSystemWatcher.Path é válido:

string root = Path.GetFullPath(configuredRoot);

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

O observador começa a monitorizar após a criação do diretório raiz.

APIs afetadas