首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# IO 異常「請求的操作無法在使用用戶映射區域打開的文件上執行」成因與解決方案

     編輯:程式設計綜合問答

異常現場

調用 File.Open、FileStream、MemoryMappedFile 等 IO 操作時拋出:
System.IO.IOException: 請求的操作無法在使用用戶映射區域打開的文件上執行。

核心成因

文件已被記憶體映射(Memory-Mapped File, MMF)打開並持有視圖,嘗試進行不兼容的常規文件流操作。 具體場景:

  1. 進程 A 創建 MemoryMappedFile.CreateFromFile(...) 並調用 CreateViewStream() 獲取視圖流,未釋放。
  2. 進程 B(或同進程另一線程)嘗試 File.Open(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None) 獲取獨佔鎖。
  3. Windows 內核檢測到文件已有區段對象映射,拒絕打開常規文件句柄,拋出上述異常。

解決方案矩陣

場景策略代碼要點
同進程順序訪問嚴格釋放視圖流後再打開文件流viewStream.Dispose(); mmf.Dispose(); 後再 File.Open...
跨進程共享讀寫統一使用 MMF 視圖流,放棄 FileStream協議:所有讀寫通過 MemoryMappedViewAccessor 或 ViewStream
需兼容舊代碼打開文件時指定 FileShare.ReadWriteFile.Open(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)
大文件隨機讀寫全程採用 MMF,利用虛擬記憶體管理var mmf = MemoryMappedFile.CreateFromFile(path); var accessor = mmf.CreateViewAccessor();

調試定位技巧

  • 使用 Handle.exe (Sysinternals) 或 Process Explorer 搜索文件路徑,查看哪個進程持有 Section 對象。
  • 代碼中添加 try/finally 確保 IDisposable 資源確定性釋放。
  • 懷疑防病毒/備份軟件掛載濾鏡驅動導致誤判,嘗試添加排除路徑。

最佳實踐原則

  1. 同一文件,同一時刻,單一訪問模式: 要么全用 MMF,要么全用 FileStream,不要混用。
  2. 共享模式寬容: 除非極其確定獨佔,否則默認 FileShare.ReadWrite。
  3. 資源作用域最小化: using 塊包裹所有流與映射對象。

理解「區段對象與文件句柄互斥」的 Windows 內核語義,即可從根源避免此類 IO 衝突。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved