調用 File.Open、FileStream、MemoryMappedFile 等 IO 操作時拋出:
System.IO.IOException: 請求的操作無法在使用用戶映射區域打開的文件上執行。
文件已被記憶體映射(Memory-Mapped File, MMF)打開並持有視圖,嘗試進行不兼容的常規文件流操作。 具體場景:
MemoryMappedFile.CreateFromFile(...) 並調用 CreateViewStream() 獲取視圖流,未釋放。File.Open(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None) 獲取獨佔鎖。| 場景 | 策略 | 代碼要點 |
|---|---|---|
| 同進程順序訪問 | 嚴格釋放視圖流後再打開文件流 | viewStream.Dispose(); mmf.Dispose(); 後再 File.Open... |
| 跨進程共享讀寫 | 統一使用 MMF 視圖流,放棄 FileStream | 協議:所有讀寫通過 MemoryMappedViewAccessor 或 ViewStream |
| 需兼容舊代碼 | 打開文件時指定 FileShare.ReadWrite | File.Open(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite) |
| 大文件隨機讀寫 | 全程採用 MMF,利用虛擬記憶體管理 | var mmf = MemoryMappedFile.CreateFromFile(path); var accessor = mmf.CreateViewAccessor(); |
Section 對象。try/finally 確保 IDisposable 資源確定性釋放。FileShare.ReadWrite。using 塊包裹所有流與映射對象。理解「區段對象與文件句柄互斥」的 Windows 內核語義,即可從根源避免此類 IO 衝突。