38

写入 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) 函数时发生了错误。

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

4

5 回答 5

45

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

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

于 2009-08-19T21:33:24.590 回答
13

看起来您尝试编写的文件已经在其他地方打开,无论是您的代码还是其他进程。

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

您可以使用进程资源管理器找出哪个进程已打开文件句柄 - 使用Find/Find handle or DLL...命令。

于 2009-08-19T21:34:31.093 回答
7

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

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

lock(file){ write to file code here }
于 2012-11-15T12:30:47.493 回答
5

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

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

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

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

 while (i++<100000000) {
   File.WriteAllLines(...)
   Thread.Sleep(1);
 }
于 2012-03-19T22:58:06.263 回答
0

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

于 2020-10-19T17:50:12.573 回答