FileStream, Unix'te paylaşılan kilit ile dosyaları kilitler
Unix'te, yalnızca izinlerle FileAccess.Read kullanarak FileStream bir dosya açar ve ardından dosyanın bir bölgesini kilitlemek için çağrısı FileStream.Lock(Int64, Int64) yaparsanız, işlem artık başarılı olur. Çalışma zamanı dosyayı yazma kilidi yerine paylaşılan veya okuma kilidiyle kilitlediğinden başarılı olur.
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
}
İşlemin her zaman başarılı olduğu Windows'ta davranışta bir değişiklik yoktur.
Önceki davranış
Unix'te, dosyayı yalnızca okuma izinlerine sahip bir FileStream kullanarak açtıysanız ve dosyanın bir bölgesini kilitlemek için çağrıldıysanız FileStream.Lock(Int64, Int64) , çalışma zamanı dosyayı yazma kilidiyle kilitlemeye çalıştı. Bunun sonucunda bir UnauthorizedAccessException ve "Yola erişim reddedildi" iletisiyle sonuçlandı.
Yeni davranış
.NET 6'dan başlayarak, dosyayı yalnızca Unix üzerinde okuma izinlerine sahip bir FileStream kullanarak açar ve dosyanın bir bölgesini kilitlemek için çağırırsanız FileStream.Lock(Int64, Int64) , çalışma zamanı dosyayı bir okuma kilidiyle (paylaşılan kilit olarak da bilinir) kilitler.
Sürüm kullanıma sunulmuştur
.NET 6 RC 1
Hataya neden olan değişikliğin türü
Bu değişiklik ikili uyumluluğu etkileyebilir.
Değişiklik nedeni
FileStream.Lock(Int64, Int64) , kullanıcıların dosyanın belirli bir bölgesini kilitlemesine olanak tanıyan API'dir. Temel kilitleme yöntemini seçmenize olanak tanıyan bir API olmadığından, FileStream.Lock(Int64, Int64) dosya izinleri için uygun kilitleme yöntemini doğru şekilde belirlemelidir.
Önerilen eylem
.NET 6'nın öncesinde, dosyayı kilitleyebilmek için aşağıdakilerden birini yapmanız gerekiyordu:
- Kodun Windows'ta yürütülmekte olup olmadığını veya FileStream izinle FileAccess.Write açılıp açılmadığını denetleyin.
- FileStream.Lock(Int64, Int64) öğesini yakalamak için çağrıyı ile
try catch
sarmalamaUnauthorizedAccessException.
Bu geçici çözümlerden birini kullandıysanız artık bunları kaldırabilirsiniz.