2009-08-19 5 views
32

erhielt ich einen sehr seltsam IOException, wenn in eine XML-Datei zu schreiben:System.IO.Exception-Fehler: "Die angeforderte Operation kann nicht für eine Datei mit einem benutzerdefinierten zugeordneten Abschnitt ausgeführt werden."

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) 

Der Fehler passiert, wenn ich XmlDocument den Save (string) Funktion aufgerufen.

Irgendwelche Ideen, was passiert ist?

Antwort

33

Sieht so aus, als hätte ein anderer Prozess die Datei mit den APIs für die Dateizuordnung (Shared Memory) geöffnet.

Die Suchfunktion in Process Explorer sollte Ihnen sagen können.

+3

Es könnte auch vorübergehend sein (gerade passiert mir, nächste Schreibversuch war in Ordnung, aber ich scheiterte bei der nächsten Datei, die dann beim nächsten Versuch funktionierte), wie wenn ein Antivirus-Scanner durch Ihre Welt rockt. –

9

Es sieht so aus, als ob die Datei, die Sie schreiben möchten, bereits an anderer Stelle geöffnet ist, entweder durch Ihren Code oder durch einen anderen Prozess.

Haben Sie die Datei in einem Editor geöffnet? Haben Sie einen anderen Code, der es liest, aber vergisst, es zu schließen?

Sie können Process Explorer verwenden, um herauszufinden, welcher Prozess Dateihandle geöffnet hat - verwenden Sie den Befehl Find/Find handle or DLL....

+0

No Find/Find Griff oder DLL in Win 2012 r2:/ – Owl

4

Das O oder Rahmen können Sie scheitern, wenn Sie die gleiche Datei immer und immer wieder in einer engen Schleife zu öffnen versuchen, zum Beispiel

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

Natürlich können Sie nicht wollen, zu tun, eigentlich, dass . Aber ein Fehler in Ihrem Code könnte dazu führen, dass dies geschieht. Der Absturz ist nicht auf Ihren Code zurückzuführen, sondern auf ein Problem mit Windows oder .NET Framework.

Wenn Sie sehr viele Dateien sehr schnell schreiben müssen, können Sie eine kleine Verzögerung mit Thread.Sleep() hinzufügen, die auch das OS von Ihrem Rücken zu bekommen scheint.

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

Putting "Ein kleiner Schlaf, der es aus irgendeinem Grund behebt" ist nie eine gute Idee :( –

+0

Ich klärte meine Antwort. Ich weiß, dass kleine Betten sind keine gute Idee , aber manchmal ist das alles, was Sie dem Betriebssystem oder dem Framework aussetzen können.Dies ist mit .NET 3.5 SP1 geschehen. –

6

versuchen, die Datei aus Ihrem Projekt ohne während Sie debuggen. Ich fand heraus, dass es tatsächlich VS2010 war, der die XML-Datei enthielt. Sie können dann in Ihrem Lösungsexplorer "Alle Dateien anzeigen" auswählen, um die XML-Datei nach dem Debuggen zu überprüfen.

Eine Sperre wird das Problem bei mehreren Schreibvorgängen stoppen.

lock(file){ write to file code here }