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.
Azione consigliata
Prima di .NET 6, per poter bloccare il file, era necessario eseguire una delle operazioni seguenti:
- Controllare se il codice veniva eseguito in Windows o se FileStream veniva aperto con l'autorizzazione FileAccess.Write.
- Eseguire il wrapping della chiamata FileStream.Lock(Int64, Int64) con
try catch
per intercettare l'eccezione UnauthorizedAccessException.
Se è stata usata una di queste soluzioni alternative, è ora possibile rimuoverle.