Partager via


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.

Avant .NET 6, pour pouvoir verrouiller le fichier, vous deviez effectuer l’une des opérations suivantes :

Si vous avez utilisé l’une de ces solutions de contournement, vous pouvez maintenant la supprimer.

API affectées