在 Unix 上,如果仅使用FileStreamFileAccess.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。
如果使用了其中一种解决方法,现在可以将其删除。