FileStream verrouille les fichiers avec un verrou partagé sur Unix
Sur Unix, si vous ouvrez un fichier à l’aide de FileStream avec des autorisations FileAccess.Read uniquement, puis appelez FileStream.Lock(Int64, Int64) pour verrouiller une région du fichier, l’opération réussit maintenant. Cela réussit, car le runtime verrouille le fichier avec un verrou partagé ou en lecture au lieu d’un verrou d’écriture.
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
}
Il n’y a aucune modification du comportement sur Windows, où l’opération a toujours réussi.
Comportement précédent
Sur Unix, si vous ouvriez un fichier à l’aide d’un FileStream avec des autorisations de lecture uniquement, puis appeliez FileStream.Lock(Int64, Int64) pour verrouiller une région du fichier, le runtime tentait de verrouiller le fichier avec un verrou d’écriture. Cela entraînait une exception UnauthorizedAccessException et le message « L’accès au chemin d’accès est refusé ».
Nouveau comportement
À partir de .NET 6, si vous ouvrez un fichier à l’aide d’un FileStream avec des autorisations de lecture uniquement sur Unix, puis appelez FileStream.Lock(Int64, Int64) pour verrouiller une région du fichier, le runtime verrouille le fichier avec un verrou de lecture (également appelé verrou partagé).
Version introduite
.NET 6 RC 1
Type de changement cassant
Ce changement peut affecter la compatibilité binaire.
Raison du changement
FileStream.Lock(Int64, Int64) est l’API qui permet aux utilisateurs de verrouiller une région spécifique d’un fichier. Il n’existe aucune API qui vous permet de choisir la méthode de verrouillage sous-jacente. Par conséquent, FileStream.Lock(Int64, Int64) devrait déterminer correctement la méthode de verrouillage appropriée pour les autorisations de fichier.
Action recommandée
Avant .NET 6, pour pouvoir verrouiller le fichier, vous deviez effectuer l’une des opérations suivantes :
- Vérifiez si le code a été exécuté dans Windows ou si le FileStream a été ouvert avec l’autorisation FileAccess.Write.
- Encapsulez l’appel FileStream.Lock(Int64, Int64) avec un
try catch
pour capturer le UnauthorizedAccessException.
Si vous avez utilisé l’une de ces solutions de contournement, vous pouvez maintenant la supprimer.