2009-08-19 8 views
32

J'ai reçu un IOException très étrange lors de l'écriture dans un fichier XML:Erreur System.IO.Exception: "L'opération demandée ne peut pas être effectuée sur un fichier avec une section mappée par l'utilisateur ouverte."

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) 

L'erreur est survenue quand j'ai appelé la fonction Enregistrer (chaîne) de XmlDocument.

Des idées sur ce qui s'est passé?

Répondre

33

On dirait qu'un autre processus a ouvert le fichier en utilisant les API de mappage de fichiers (mémoire partagée).

La fonction de recherche de Process Explorer devrait pouvoir vous le dire.

+3

Il pourrait également être transitoire (juste arrivé à moi, la prochaine tentative d'écriture était bien, mais j'échoué sur le fichier suivant, qui a ensuite travaillé très bien sur la prochaine tentative), comme quand un scanner antivirus bascule dans votre monde. –

9

Il semble que le fichier que vous essayez d'écrire est déjà ouvert ailleurs, soit par votre code, soit par un autre processus.

Avez-vous le fichier ouvert dans un éditeur? Avez-vous un autre code qui le lit, mais oublie de le fermer?

Vous pouvez utiliser Process Explorer pour savoir quel processus a un fichier ouvert - utilisez la commande Find/Find handle or DLL....

+0

Pas de recherche/Trouver un handle ou une DLL dans Win 2012 r2:/ – Owl

4

Le système d'exploitation ou cadre peut vous ne parvenez pas, si vous essayez d'ouvrir encore et encore le même fichier dans une boucle serrée, par exemple

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

Bien sûr, vous ne voulez pas faire réellement que . Mais un bug dans votre code pourrait provoquer cela. Le plantage n'est pas dû à votre code, mais à un problème avec Windows ou le .NET Framework.

Si vous devez écrire beaucoup de fichiers très rapidement, vous pouvez ajouter un petit délai avec Thread.Sleep() qui semble également avoir le système d'exploitation sur votre dos.

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

mettant "Un petit sommeil qui le fixe pour une raison quelconque" n'est jamais une bonne idée :( –

+0

J'ai clarifié ma réponse Je réalise que les petits sommeils ne sont pas une bonne idée , mais parfois c'est tout ce que vous pouvez faire à la merci du système d'exploitation ou de l'infrastructure.Ce plantage s'est produit avec .NET 3.5 SP1. –

6

Essayez d'exclure le fichier de votre projet pendant le débogage. J'ai trouvé que c'était VS2010 qui contenait le fichier XML. Vous pouvez ensuite sélectionner "Afficher tous les fichiers" dans votre explorateur de solution pour vérifier le débogage du fichier XML. Un verrou arrête le problème lors de plusieurs écritures.

lock(file){ write to file code here }