FileStream により Unix 上の共有ロックによってファイルがロックされる
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 のアクセス許可で開いているかどうかを確認する。
- UnauthorizedAccessException をキャプチャするために、
try catch
を使用して FileStream.Lock(Int64, Int64) 呼び出しをラップする。
これらの回避策のいずれかを使用していた場合、これらを解除できるようになりました。
影響を受ける API
.NET