web-dev-qa-db-fra.com

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."

J'ai reçu une exception IOException très étrange lors de l'écriture dans un fichier XML:

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 s'est produite lorsque j'ai appelé la fonction Save (string) de XmlDocument.

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

36
Bryan Denny

Il semble qu'un autre processus ait ouvert le fichier à l'aide des API de mappage de fichiers (mémoire partagée).

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

41
Richard

Il semble que le fichier que vous essayez d'écrire soit 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 contient un descripteur de fichier ouvert - utilisez le Find/Find handle or DLL... commande.

10
RichieHindle

Essayez d'exclure le fichier de votre projet pendant le débogage. J'ai trouvé que c'était en fait VS2010 qui contenait le fichier XML. Vous pouvez ensuite sélectionner "Afficher tous les fichiers" dans votre explorateur de solutions pour vérifier le fichier XML après le débogage.

Un verrou arrêtera le problème lors de plusieurs écritures.

lock(file){ write to file code here }
7
VipX1

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

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

Bien sûr, vous ne voulez pas vraiment faire ça. Mais un bogue 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 vous débarrasser du système d'exploitation.

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