写入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(字符串)函数时发生错误。
关于发生了什么的任何想法?
答案 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 ..错误消失之后,我更改了此逻辑以将文件保存一次。