Compartir a través de


FileStream bloquea archivos con un bloqueo compartido en Unix

En Unix, si abre un archivo mediante FileStream solo con permisos FileAccess.Read y, a continuación, llama a FileStream.Lock(Int64, Int64) para bloquear una región del archivo, la operación se realizará correctamente. Esto se debe a que el entorno de ejecución aplica al archivo un bloqueo compartido o de lectura, en lugar de un bloqueo de escritura.

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
}

No hay ningún cambio en el comportamiento de Windows, donde la operación siempre se ha realizado correctamente.

Comportamiento anterior

En Unix, si se abría un archivo mediante un elemento FileStream solo con permisos de lectura y, a continuación, se llamaba a FileStream.Lock(Int64, Int64) para bloquear una región del archivo, el entorno de ejecución intentaba aplicar al archivo un bloqueo de escritura. Como resultado, se obtenía la excepción UnauthorizedAccessException y el mensaje "Acceso denegado a la ruta de acceso".

Comportamiento nuevo

A partir de .NET 6, si abre un archivo mediante un elemento FileStream solo con permisos de lectura en Unix y, a continuación, llama a FileStream.Lock(Int64, Int64) para bloquear una región del archivo, el entorno de ejecución aplica al archivo un bloqueo de lectura (también conocido como bloqueo compartido).

Versión introducida

.NET 6 RC 1

Tipo de cambio importante

Este cambio puede afectar a la compatibilidad binaria.

Motivo del cambio

FileStream.Lock(Int64, Int64) es la API que permite a los usuarios bloquear una región específica de un archivo. No hay ninguna API que le permita elegir el método de bloqueo subyacente, por lo que FileStream.Lock(Int64, Int64) debe determinar correctamente el método de bloqueo adecuado para los permisos de archivo.

Antes de .NET 6, para poder bloquear el archivo, tenía que realizar una de las acciones siguientes:

Si usó alguna de estas soluciones alternativas, ahora puede eliminarla.

API afectadas