Compartilhar via


FileStream bloqueia arquivos com bloqueio compartilhado no UNIX

Agora, no UNIX, se você abrir um arquivo usando FileStream apenas com permissões FileAccess.Read e chamar FileStream.Lock(Int64, Int64) para bloquear uma região do arquivo, a operação será bem-sucedida. Ele é bem-sucedido porque o runtime bloqueia o arquivo com um bloqueio compartilhado ou de leitura em vez de um bloqueio de gravação.

using (FileStream fs = File.OpenRead("testfile")) // Opening with FileAccess.Read only
{
    fs.Lock((long) 3, (long) 1); // Attempting to lock a region of the read-only file
}

Não há nenhuma alteração no comportamento no Windows, em que a operação sempre foi bem-sucedida.

Comportamento anterior

No UNIX, se você abria um arquivo usando um FileStream apenas com permissões de leitura e depois chamava FileStream.Lock(Int64, Int64) para bloquear uma região do arquivo, o runtime tentava bloquear o arquivo com um bloqueio de gravação. Isso resultava em uma UnauthorizedAccessException e na mensagem "O acesso ao caminho foi negado".

Novo comportamento

Do .NET 6 em diante, se você abrir um arquivo usando um FileStream apenas com permissões de leitura no UNIX e chamar FileStream.Lock(Int64, Int64) para bloquear uma região do arquivo, o runtime bloqueará o arquivo com um bloqueio de leitura (também conhecido como bloqueio compartilhado).

Versão introduzida

.NET 6 RC 1

Tipo de alteração interruptiva

Essa alteração pode afetar a compatibilidade binária.

Motivo da alteração

FileStream.Lock(Int64, Int64) é a API que permite que os usuários bloqueiem uma região específica de um arquivo. Não há nenhuma API que permita escolher o método de bloqueio subjacente, portanto FileStream.Lock(Int64, Int64) deve determinar corretamente o método de bloqueio apropriado para as permissões de arquivo.

Antes do .NET 6, para poder bloquear o arquivo, era necessário executar um dos seguintes procedimentos:

Se você usava uma dessas soluções alternativas, agora poderá eliminá-las.

APIs afetadas