FileStream sperrt Dateien mit freigegebener Sperre unter Unix

Wenn Sie unter Unix eine Datei mit nur mit den Berechtigungen FileStream und FileAccess.Read öffnen und dann FileStream.Lock(Int64, Int64) aufrufen, um einen Bereich der Datei zu sperren, wird der Vorgang jetzt erfolgreich ausgeführt. Der Vorgang ist erfolgreich, weil die Runtime die Datei mit einer gemeinsamen Sperre oder einer Lesesperre anstelle einer Schreibsperre sperrt.

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
}

Es gibt keine Änderung des Verhaltens unter Windows, da der Vorgang dort schon immer erfolgreich war.

Vorheriges Verhalten

Wenn Sie unter Unix eine Datei mit einem FileStream nur mit Leseberechtigungen geöffnet und dann FileStream.Lock(Int64, Int64) aufgerufen haben, um einen Bereich der Datei zu sperren, versuchte die Runtime, die Datei mit einer Schreibsperre zu sperren. Dies führte zu einer UnauthorizedAccessException und der Meldung, dass der Zugriff auf den Pfad verweigert wurde.

Neues Verhalten

Ab .NET 6 gilt Folgendes: Wenn Sie unter Unix eine Datei mit einem FileStream nur mit Leseberechtigungen öffnen und dann FileStream.Lock(Int64, Int64) aufrufen, um einen Bereich der Datei zu sperren, sperrt die Runtime die Datei mit einer Lesesperre (auch als gemeinsame Sperre bezeichnet).

Eingeführt in Version

.NET 6 RC 1

Typ des Breaking Changes

Diese Änderung kann sich auf die binäre Kompatibilität auswirken.

Grund für die Änderung

FileStream.Lock(Int64, Int64) ist die API, die Benutzern das Sperren eines bestimmten Bereichs einer Datei ermöglicht. Es gibt keine API, mit der Sie die zugrunde liegende Sperrmethode auswählen können. Daher sollte FileStream.Lock(Int64, Int64) die geeignete Sperrmethode für die Dateiberechtigungen richtig bestimmen.

Vor .NET 6 mussten Sie eine der folgenden Schritte ausführen, um die Datei sperren zu können:

Wenn Sie eine dieser Problemumgehungen verwendet haben, können Sie diese jetzt entfernen.

Betroffene APIs