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.
Ação recomendada
Antes do .NET 6, para poder bloquear o arquivo, era necessário executar um dos seguintes procedimentos:
- Verificar se o código estava sendo executado no Windows ou se FileStream tinha sido aberto com a permissão FileAccess.Write.
- Encapsular a chamada FileStream.Lock(Int64, Int64) com um
try catch
para capturar o UnauthorizedAccessException.
Se você usava uma dessas soluções alternativas, agora poderá eliminá-las.