Udostępnij za pośrednictwem


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.

Przed programem .NET 6, aby można było zablokować plik, należy wykonać jedną z następujących czynności:

Jeśli użyto jednego z tych obejść, możesz je teraz usunąć.

Dotyczy interfejsów API