Freigeben über


FileStream sperrt Dateien mit freigegebener Sperre unter Unix

Auf Unix, wenn Sie eine Datei nur mit FileStreamFileAccess.Read Berechtigungen öffnen und dann FileStream.Lock(Int64, Int64) aufrufen, um eine Region der Datei zu sperren, wird der Vorgang nun 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, bei dem der Vorgang immer erfolgreich war.

Vorheriges Verhalten

Unter Unix, wenn Sie eine Datei mit FileStream nur Leseberechtigung geöffnet haben und dann FileStream.Lock(Int64, Int64) aufgerufen haben, um einen Bereich der Datei zu sperren, hat die Laufzeit versucht, die Datei mit einem Schreibschutz zu sperren. Dies führte zu einer UnauthorizedAccessException und der Meldung "Der Zugriff auf den Pfad wurde verweigert".

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ührte Version

.NET 6 RC 1

Art der einschneidenden Änderung

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

Grund für Änderung

FileStream.Lock(Int64, Int64) ist die API, mit der Benutzer eine bestimmte Region einer Datei sperren können. Es gibt keine API, mit der Sie die zugrunde liegende Sperrmethode auswählen können. Daher FileStream.Lock(Int64, Int64) sollten Sie die entsprechende Sperrmethode für die Dateiberechtigungen ordnungsgemäß ermitteln.

Bevor .NET 6 die Datei sperren kann, mussten Sie eine der folgenden Aktionen ausführen:

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

Betroffene APIs