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 之前,若要锁定文件,必须执行以下操作之一:

如果使用了其中一种解决方法,现在可以将其删除。

受影响的 API