FileStream 使用 Unix 上的共享锁来锁定文件
在 Unix 上,如果使用仅具有 FileAccess.Read 权限的 FileStream 打开文件,然后调用 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 权限打开的。
- 使用
try catch
包装 FileStream.Lock(Int64, Int64) 调用以捕获 UnauthorizedAccessException。
如果使用了其中一种解决方法,现在可以将其删除。