FileStream blokuje pliki z udostępnioną blokadą w systemie Unix
W systemie Unix, jeśli otworzysz plik przy użyciu FileStream tylko z uprawnieniami FileAccess.Read , a następnie wywołaj polecenie FileStream.Lock(Int64, Int64) w celu zablokowania regionu pliku, operacja zakończy się teraz powodzeniem. Kończy się to powodzeniem, ponieważ środowisko uruchomieniowe blokuje plik za pomocą blokady udostępnionej lub odczytu zamiast blokady zapisu.
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
}
Nie ma żadnych zmian w zachowaniu w systemie Windows, gdzie operacja zawsze zakończyła się pomyślnie.
Poprzednie zachowanie
W systemie Unix, jeśli plik został otwarty przy użyciu FileStream tylko z uprawnieniami do odczytu, a następnie wywołany FileStream.Lock(Int64, Int64) w celu zablokowania regionu pliku, środowisko uruchomieniowe próbowało zablokować plik za pomocą blokady zapisu. Spowodowało to odmowę UnauthorizedAccessException dostępu do ścieżki i komunikat "Odmowa dostępu do ścieżki".
Nowe zachowanie
Począwszy od platformy .NET 6, jeśli otworzysz plik przy użyciu elementu FileStream z uprawnieniami do odczytu tylko w systemie Unix, a następnie wywołaj polecenie FileStream.Lock(Int64, Int64) w celu zablokowania regionu pliku, środowisko uruchomieniowe blokuje plik z blokadą odczytu (znaną również jako udostępniona blokada).
Wprowadzona wersja
.NET 6 RC 1
Typ zmiany powodującej niezgodność
Ta zmiana może mieć wpływ na zgodność binarną.
Przyczyna wprowadzenia zmiany
FileStream.Lock(Int64, Int64) to interfejs API, który umożliwia użytkownikom blokowanie określonego regionu pliku. Nie ma interfejsu API, który pozwala wybrać podstawową metodę blokowania, dlatego FileStream.Lock(Int64, Int64) należy poprawnie określić odpowiednią metodę blokowania dla uprawnień pliku.
Zalecana akcja
Przed programem .NET 6, aby można było zablokować plik, należy wykonać jedną z następujących czynności:
- Sprawdź, czy kod był wykonywany w systemie Windows, czy FileStream został otwarty z uprawnieniami FileAccess.Write .
- Zawijaj wywołanie za FileStream.Lock(Int64, Int64) pomocą elementu ,
try catch
aby przechwycić UnauthorizedAccessExceptionelement .
Jeśli użyto jednego z tych obejść, możesz je teraz usunąć.