FileStream 使用 Unix 上的共享锁来锁定文件

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

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

受影响的 API