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函数应该能够告诉您.
Ric*_*dle 10
看起来您尝试编写的文件已经在其他地方打开,无论是您的代码还是其他进程.
你是否在编辑器中打开了文件?你有其他一些代码可以读取它,但忘了关闭它吗?
您可以使用Process Explorer找出哪个进程有打开文件句柄 - 使用Find/ Find handle or DLL...命令.
在调试时尝试从项目中排除文件.我发现它实际上是VS2010,它持有XML文件.然后,您可以在解决方案资源管理器中选择"显示所有文件"以检查调试后的XML文件.
执行多次写入时,锁定将停止该问题.
lock(file){ write to file code here }
Run Code Online (Sandbox Code Playgroud)
例如,如果您尝试在紧密循环中反复打开相同的文件,操作系统或框架可能会让您失败
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)
| 归档时间: |
|
| 查看次数: |
62970 次 |
| 最近记录: |