FileStream uzamkne soubory se sdíleným zámkem v unixovém systému Unix.
Pokud v systému Unix otevřete soubor pouze FileStream s oprávněními FileAccess.Read a potom zavoláte FileStream.Lock(Int64, Int64) zamknutí oblasti souboru, operace bude nyní úspěšná. Je to úspěšné, protože modul runtime zamkne soubor sdíleným zámkem nebo zámkem pro čtení místo zámku zápisu.
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
}
Ve Windows nedošlo k žádné změně chování, kdy operace vždy proběhla úspěšně.
Předchozí chování
Pokud jste v systému Unix otevřeli soubor pouze s FileStream oprávněními ke čtení a pak volali FileStream.Lock(Int64, Int64) k uzamčení oblasti souboru, modul runtime se pokusil soubor uzamknout zámkem zápisu. Výsledkem je UnauthorizedAccessException zpráva "Přístup k cestě je odepřen".
Nové chování
Počínaje rozhraním .NET 6 otevřete soubor pomocí FileStream oprávnění ke čtení pouze v systému Unix a potom zavoláte FileStream.Lock(Int64, Int64) uzamčení oblasti souboru, modul runtime zamkne soubor zámkem čtení (označuje se také jako sdílený zámek).
Zavedená verze
.NET 6 RC 1
Typ zásadní změny
Tato změna může ovlivnit binární kompatibilitu.
Důvod změny
FileStream.Lock(Int64, Int64) je rozhraní API, které umožňuje uživatelům uzamknout konkrétní oblast souboru. Neexistuje žádné rozhraní API, které vám umožní zvolit základní metodu uzamčení, takže FileStream.Lock(Int64, Int64) by měla správně určit odpovídající metodu uzamčení pro oprávnění k souborům.
Doporučená akce
Před .NET 6, abyste mohli soubor uzamknout, museli jste udělat jednu z těchto věcí:
- Zkontrolujte, jestli se kód spouštěl ve Windows nebo FileStream jestli byl otevřen s oprávněním FileAccess.Write .
- FileStream.Lock(Int64, Int64) Zabalte hovor a
try catch
zachytíte ho UnauthorizedAccessException.
Pokud jste použili jedno z těchto alternativních řešení, můžete je teď odebrat.