Unix では、FileStreamアクセス許可のみを持つFileAccess.Readを使用してファイルを開き、FileStream.Lock(Int64, Int64)を呼び出してファイルの領域をロックすると、操作は成功します。 ランタイムが書き込みロックではなく共有ロックまたは読み取りロックでファイルをロックするため、成功します。
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
}
操作が常に成功した Windows での動作に変更はありません。
以前の動作
Unix では、読み取りアクセス許可のみを持つ FileStream を使用してファイルを開き、ファイルの領域をロックするために FileStream.Lock(Int64, Int64) を呼び出した場合、ランタイムは書き込みロックを使用してファイルをロックしようとしました。 その結果、 UnauthorizedAccessException が発生し、"パスへのアクセスが拒否されました" というメッセージが表示されます。
新しい動作
.NET 6 以降では、Unix でのみ読み取りアクセス許可を持つ FileStream を使用してファイルを開き、 FileStream.Lock(Int64, Int64) を呼び出してファイルの領域をロックすると、ランタイムは読み取りロック ( 共有ロックとも呼ばれます) でファイルをロックします。
導入されたバージョン
.NET 6 RC 1
破壊的変更の種類
この変更は 、バイナリの互換性に影響する可能性があります。
変更の理由
FileStream.Lock(Int64, Int64) は、ユーザーがファイルの特定のリージョンをロックできるようにする API です。 基になるロック方法を選択できる API がないため、 FileStream.Lock(Int64, Int64) はファイルのアクセス許可に対する適切なロック方法を正しく決定する必要があります。
推奨されるアクション
.NET 6 より前のバージョンでは、ファイルをロックするには、次のいずれかの操作を行う必要がありました。
- コードが Windows で実行されていたか、 FileStream が FileAccess.Write アクセス許可で開かれたかどうかを確認します。
-
FileStream.Lock(Int64, Int64)呼び出しを
try catchでラップして、UnauthorizedAccessExceptionをキャプチャします。
これらの回避策のいずれかを使用した場合は、それらを削除できます。
影響を受ける API
.NET