【问题标题】:System.IO.Exception error: "The requested operation cannot be performed on a file with a user-mapped section open."System.IO.Exception 错误:“无法对打开了用户映射部分的文件执行请求的操作。”
【发布时间】:2010-11-21 02:56:08
【问题描述】:

我在写入 XML 文件时收到了一个非常奇怪的 IOException:

System.IO.IOException: The requested operation cannot be performed on a file with a user-mapped section open.

   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
   at System.Xml.XmlTextWriter..ctor(String filename, Encoding encoding)
   at System.Xml.XmlDocument.Save(String filename)

当我调用 XmlDocument 的 Save(string) 函数时发生错误。

对发生的事情有什么想法吗?

【问题讨论】:

    标签: c# xml ioexception


    【解决方案1】:

    看起来另一个进程使用文件映射(共享内存)API 打开了文件。

    Process Explorer 中的查找功能应该可以告诉你。

    【讨论】:

    • 它也可能是暂时的(只是发生在我身上,下一次写入尝试很好,但我在下一个文件上失败了,然后在下一次尝试时工作正常),比如当防病毒扫描程序在你的世界。
    【解决方案2】:

    您尝试写入的文件似乎已在其他地方打开,无论是您的代码还是其他进程。

    您是否在编辑器中打开了文件?您是否有其他代码读取它但忘记关闭它?

    您可以使用Process Explorer 找出哪个进程有打开的文件句柄 - 使用Find / Find handle or DLL... 命令。

    【讨论】:

    • 在 Win 2012 r2 中没有查找/查找句柄或 DLL :/
    【解决方案3】:

    在调试时尝试从项目中排除该文件。我发现实际上是 VS2010 保存了 XML 文件。 然后,您可以在解决方案资源管理器中选择“显示所有文件”以检查 XML 文件后调试。

    执行多次写入时,锁将停止问题。

    lock(file){ write to file code here }
    

    【讨论】:

      【解决方案4】:

      操作系统或框架可能会让你失败,例如,如果你试图在一个紧密的循环中一遍又一遍地打开同一个文件,例如

       while (true) {
         File.WriteAllLines(...)
       }
      

      当然,您并不想实际这样做。但是您的代码中的错误可能会导致这种情况发生。崩溃不是由于您的代码,而是 Windows 或 .NET Framework 的问题。

      如果您必须非常快速地写入大量文件,您可以使用 Thread.Sleep() 增加一个小延迟,这似乎也让操作系统远离您。

       while (i++<100000000) {
         File.WriteAllLines(...)
         Thread.Sleep(1);
       }
      

      【讨论】:

      • 把“由于某种原因修复它的小睡眠”绝不是一个好主意:(
      • 我澄清了我的回答。我意识到小睡眠不是一个好主意,但有时你只能在操作系统或框架的摆布下做这件事。这种崩溃发生在 .NET 3.5 SP1 中。
      【解决方案5】:

      在我的例子中,正在迭代 xml 文档中的记录,并且在每次迭代中,记录都被编辑和保存。我改变了这个逻辑,在所有的记录都被编辑和 pofff 之后保存文件一次。错误消失了。

      【讨论】:

        猜你喜欢
        • 2011-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        相关资源
        最近更新 更多