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 foram aceitas anteriormente em tempo de construção agora geram uma exceção.

Versão introduzida

.NET 11 Versão 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 aceita no momento da construção e falhar durante uma operação posterior do watcher.

Os construtores também aceitavam um FileSystemWatcher cujo Path não vazio não tinha relação com root. Esse observador geralmente não podia relatar alterações relevantes para a raiz configurada, mas a incompatibilidade não fazia com que o construtor fosse lançado.

Por exemplo, a construção a seguir foi bem-sucedida:

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 rejeitam entradas inválidas no momento da construção:

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

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

Um diretório raiz que ainda não existe permanece válido. O monitoramento de arquivos é adiado até que o diretório raiz seja criado.

Tipo de mudança disruptiva

Esta é uma alteração comportamental.

Motivo da alteração

PhysicalFilesWatcher agora dá suporte a raízes que não existem quando o observador é construído. Isso requer a normalização da raiz e a coordenação de um FileSystemWatcher fornecido com a raiz.

Um FileSystemWatcher que monitora um diretório não relacionado não pode produzir notificações confiável para a raiz configurada. Ao rejeitar essa combinação inválida no momento da construção, evita-se a criação de um watcher em uma configuração que, em geral, não funcionava. A validação da raiz também faz com que caminhos inválidos falhem imediatamente, em vez de falharem apenas durante uma operação posterior do observador. Para obter mais informações, consulte dotnet/runtime#126411.

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

Quando você fornecer um FileSystemWatcher com um Path não vazio, configure o caminho dele para ser igual a, um ancestral de 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 será 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 monitorar depois que o diretório raiz é criado.

APIs afetadas