2009-08-19 14 views
32

que recibieron una IOException muy raro cuando se escribe en un archivo XML:Error de System.IO.Exception: "La operación solicitada no puede realizarse en un archivo con una sección mapeada por el usuario abierta".

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) 

El error ocurrió cuando llamé a la función Guardar (cadena) de XmlDocument.

¿Alguna idea sobre lo que sucedió?

Respuesta

33

Parece que otro proceso tuvo el archivo abierto utilizando las API de mapeo de archivos (memoria compartida).

La función de búsqueda en Process Explorer debería poder decirle.

+3

También podría ser transitoria (me acaba de suceder, próximo intento de escritura estaba bien, pero no en el siguiente archivo, que luego funcionó bien en el próximo intento), como cuando un escáner antivirus está oscilando a través de su mundo. –

9

Parece que el archivo que está tratando de escribir ya está abierto en otra parte, ya sea por su código o por otro proceso.

¿Tiene el archivo abierto en un editor? ¿Tiene algún otro código que lo lea pero se olvida de cerrarlo?

Puede usar Process Explorer para averiguar qué proceso tiene el manejador de archivo abierto en él - use el comando Find/Find handle or DLL....

+0

No encuentra/encuentra el identificador o DLL en Win 2012 r2:/ – Owl

4

El sistema operativo o marco que puede fallar, si intenta abrir el mismo archivo una y otra vez en un bucle estrecho, por ejemplo

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

Por supuesto, no quiero realmente hacer eso . Pero un error en su código podría provocar que eso suceda. El bloqueo no se debe a su código, sino a un problema con Windows o .NET Framework.

Si tiene que escribir muchos archivos muy rápidamente, puede agregar un pequeño retraso con Thread.Sleep() que también parece quitarle el sistema operativo.

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

poniendo "Un sueño pequeño que lo arregla por alguna razón" nunca es una buena idea :( –

+0

Aclare mi respuesta. Me doy cuenta de que los sueños pequeños no son una buena idea , pero a veces eso es todo lo que puede hacer a merced del sistema operativo o el marco. Esto se colapsó con .NET 3.5 SP1. –

6

Pruebe excluyendo el archivo de su proyecto mientras depura. Descubrí que, de hecho, VS2010 tenía el archivo XML. Puede seleccionar "Mostrar todos los archivos" en su explorador de soluciones para verificar la depuración de la publicación del archivo XML.

Un bloqueo detendrá el problema al hacer varias escrituras.

lock(file){ write to file code here } 
Cuestiones relacionadas