Condividi tramite


FileStream blocca i file con blocco condiviso su Unix

In Unix, se si apre un file usando FileStream solo con autorizzazioni FileAccess.Read e quindi si chiama FileStream.Lock(Int64, Int64) per bloccare un'area del file, l'operazione avrà ora esito positivo. Ha esito positivo perché il runtime blocca il file con un blocco condiviso o di lettura anziché un blocco di scrittura.

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
}

Non viene introdotta alcuna modifica per il comportamento in Windows, in cui l'operazione ha sempre avuto esito positivo.

Comportamento precedente

In Unix, se si apriva un file con un FileStream con autorizzazioni di sola lettura e quindi si chiamava FileStream.Lock(Int64, Int64) per bloccare un'area del file, il runtime tentava di bloccare il file con un blocco di scrittura. Ne risultavano la generazione di un'eccezione UnauthorizedAccessException e il messaggio "Accesso al percorso negato".

Nuovo comportamento

A partire da .NET 6, se si apre un file usando un FileStream con autorizzazioni di lettura solo in Unix e quindi si chiama FileStream.Lock(Int64, Int64) per bloccare un'area del file, il runtime blocca il file con un blocco di lettura (noto anche come blocco condiviso).

Versione di introduzione

.NET 6 RC 1

Tipo di modifica che causa un'interruzione

Questa modifica può influire sulla compatibilità binaria.

Motivo della modifica

FileStream.Lock(Int64, Int64) è l'API che consente agli utenti di bloccare un'area specifica di un file. Non esiste un'API che consente di scegliere il metodo di blocco sottostante, quindi FileStream.Lock(Int64, Int64) deve determinare correttamente il metodo di blocco appropriato per le autorizzazioni del file.

Prima di .NET 6, per poter bloccare il file, era necessario eseguire una delle operazioni seguenti:

Se è stata usata una di queste soluzioni alternative, è ora possibile rimuoverle.

API interessate