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

Bry*_*nny 37 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)
Run Code Online (Sandbox Code Playgroud)

当我调用XmlDocument的Save(字符串)函数时发生错误.

发生了什么事吗?

Ric*_*ard 41

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

Process Explorer中的find函数应该能够告诉您.

  • 它也可能是暂时的(刚发生在我身上,下一次写入尝试很好,但我在下一个文件上失败了,然后在下一次尝试时工作正常),就像一个防病毒扫描程序在你的世界中摇摆. (3认同)

Ric*_*dle 10

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

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

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


Vip*_*pX1 7

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

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

lock(file){ write to file code here }
Run Code Online (Sandbox Code Playgroud)


Mar*_*ata 5

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

 while (true) {
   File.WriteAllLines(...)
 }
Run Code Online (Sandbox Code Playgroud)

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

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

 while (i++<100000000) {
   File.WriteAllLines(...)
   Thread.Sleep(1);
 }
Run Code Online (Sandbox Code Playgroud)

  • 把"因某种原因修复它的小睡眠"从来都不是一个好主意:( (3认同)