System.IO.Exception错误:“无法对打开了用户映射部分的文件执行请求的操作。”

时间:2009-08-19 21:25:51

标签: c# xml ioexception

写入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(字符串)函数时发生错误。

关于发生了什么的任何想法?

5 个答案:

答案 0 :(得分:41)

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

Process Explorer中的find函数应该能够告诉你。

答案 1 :(得分:10)

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

您是否在编辑器中打开了文件?你有一些其他的代码可以读取它,但忘了关闭它吗?

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

答案 2 :(得分:7)

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

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

lock(file){ write to file code here }

答案 3 :(得分:5)

如果您尝试在紧密循环中反复打开同一文件,操作系统或框架可能会让您失望,例如

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

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

如果你必须非常快速地编写大量文件,你可以使用Thread.Sleep()添加一个小延迟,这似乎也让你的操作系统不受欢迎。

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

答案 4 :(得分:0)

在我的情况下,将对xml文档中的记录进行迭代,并且在每次迭代中都将对记录进行编辑和保存。在所有记录都被编辑并且poofff ..错误消失之后,我更改了此逻辑以将文件保存一次。