2009-06-26 23 views
6

Estoy desarrollando una aplicación que está leyendo y escribiendo mucho (pero sincrónicamente, sin embargo) a un cierto archivo en el disco. Sin embargo, la forma más grande sea el archivo consigue, más a menudo me sale el siguiente IOException:¿Qué sucede cuando 'la operación solicitada no puede realizarse en un archivo con una sección mapeada por el usuario abierta?'

La operación solicitada no se puede realizar en un archivo con una sección asignada de usuario abierta.

occuring de:

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, Int32 bufferSize, FileOptions options) 
    at System.IO.StreamWriter.CreateFile(String path, Boolean append) 
    at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) 
    at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding) 
    at System.IO.File.WriteAllText(String path, String contents, Encoding encoding) 
    at System.Windows.Forms.Control.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
    at System.Windows.Forms.Button.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.Run(Form mainForm) 
    at TestApp.Program.Main() 

Como se puede ver, la excepción es lanzada desde el interior de File.WriteAllText. Sospeché que la excepción tenía que ver con la lectura y la escritura simultáneas, así que traté de limitar el acceso al archivo. Tanto un lock como un Mutex parecían aumentar el número de excepciones en lugar de prevenirlas. Entonces, ¿qué está pasando exactamente? ¿Qué significa exactamente esta excepción y cómo se puede prevenir?

Respuesta

0

Estaba escribiendo en un archivo (abierto, en bucle (escrituras), cerrado) pero después de un error duplico la llamada a la rutina ... así que termino con "La operación solicitada no se puede realizar en un archivo con una sección mapeada por el usuario abierta. "! Bueno, eliminé la segunda llamada y luego el problema fue resuelto. Parece que dos rutinas (abrir/cerrar) (abrir/cerrar) sobre el mismo archivo que suceden demasiado pronto una detrás de otra causa esto ... Algunos desarrolladores sugieren llamar al gc. Verifique el cierre correcto de cada operación de E/S. No realizar la tarea completa (abrir, abrir (escribir), cerrar) demasiado pronto. Parece que cuando una operación se va a terminar mientras llega la segunda solicitud y eso arroja el problema.

+0

Creo que este también fue el caso en mi situación. No estoy seguro de dónde está exactamente la causa del problema y cómo debe evitarse el problema. – dbaw

0

¿Esto sucede aún con solo un hilo/proceso?

Si es así, no es un problema de enhebrado.

De lo contrario, es posible que no utilice correctamente el mutex/lock. Tal vez deberías publicar el código relevante aquí.

+0

Estoy seguro de que solo hay un proceso con un hilo, por lo que posiblemente no necesite un candado o mutex. Pero, ¿qué sucede si este proceso intenta leer (o escribir) un archivo que está en proceso de ser liberado (del lector o escritor que estaba accediendo a él)? Además, ¿qué significa realmente el mensaje de excepción? – dbaw

+0

Una respuesta a las respuestas agregadas más tarde: No, no tengo ningún programa antivirus ejecutándose. – dbaw

1

¿Tiene habilitado el software de detección de virus en tiempo real?

He perdido la cuenta de la cantidad de veces que los problemas de bloqueo de archivos han sido causados ​​por el software de detección de virus.

1

He visto este mensaje cuando el depurador de Visual Studio se pone en un nudo y bloquea el archivo PDB.

Eso puede no ser relevante para su situación, pero puede confirmar si el archivo está bloqueado (y qué) usando una utilidad descargable llamada "Unlocker" que puede detectar y eliminar bloqueos en archivos y carpetas.

6

La primera solución será apagar su antivirus. Mejor aún, puede agregar la carpeta a la lista de excepciones de escaneo de su antivirus.

0

Para mí, parece que tiene algún otro proceso que abre todos los archivos modificados con permisos que significa que no puede abrirlo para modificarlo. Esto podría ser antivirus, copia de seguridad en línea, sincronización de archivos en línea ...

Cuestiones relacionadas