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 之前,若要能夠鎖定檔案,您必須執行下列其中一項:
- 檢查程式碼是否在 Windows 中執行,或以 FileAccess.Write 權限開啟 FileStream。
- 使用
try catch
包裝 FileStream.Lock(Int64, Int64) 呼叫以擷取 UnauthorizedAccessException。
如果您使用其中一個因應措施,您現在可以移除這些因應措施。
受影響的 API
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應