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 之前,若要能夠鎖定檔案,您必須執行下列其中一項:

如果您使用其中一個因應措施,您現在可以移除這些因應措施。

受影響的 API