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.
Empfohlene Aktion
Vor .NET 6 mussten Sie eine der folgenden Schritte ausführen, um die Datei sperren zu können:
- Überprüfen Sie, ob der Code in Windows ausgeführt oder der FileStream mit der Berechtigung FileAccess.Write geöffnet wurde.
- Umschließen Sie den Aufruf FileStream.Lock(Int64, Int64) mit
try catch
, um die UnauthorizedAccessException zu erfassen.
Wenn Sie eine dieser Problemumgehungen verwendet haben, können Sie diese jetzt entfernen.