2009-06-26 3 views
6

Ich entwickle eine Anwendung, die viel (aber synchron) zu einer bestimmten Datei auf der Festplatte liest und schreibt. Wie aber größer die Datei wird, desto öfter bekomme ich die folgende IOException:Was ist falsch, wenn die angeforderte Operation für eine Datei mit einem benutzerdefinierten Bereich nicht ausgeführt werden kann?

Der angeforderte Vorgang kann nicht sein auf eine Datei ausgeführt mit einem benutzer abgebildet Abschnitt offen.

auftretende aus:

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() 

Wie Sie sehen können, wird die Ausnahme von innen File.WriteAllText geworfen. Ich vermutete, dass die Ausnahme mit gleichzeitigem Lesen und Schreiben zu tun hatte, also versuchte ich, den Zugriff auf die Datei zu beschränken. Sowohl ein lock als auch ein Mutex schienen die Anzahl der Ausnahmen zu erhöhen, anstatt sie zu verhindern. Also, was ist genau los? Was bedeutet diese Ausnahme genau und wie kann sie verhindert werden?

Antwort

0

Ich habe in eine Datei geschrieben (open, loop (writes), close), aber nach einem Fehler habe ich den Aufruf an die Rutine kopiert ... also lande ich mit "Die angeforderte Operation kann nicht mit einer Datei ausgeführt werden ein benutzerdefinierter Abschnitt wird geöffnet. "! Nun, ich habe den zweiten Anruf gelöscht und dann das Problem gelöst. Es scheint, dass zwei (öffnen/schließen) (öffnen/schließen) Rutin über die gleiche Datei geschieht zu früh nacheinander ... Einige Entwickler schlagen vor, die GC anrufen. Überprüfen Sie, ob alle E/A-Vorgänge korrekt abgeschlossen wurden. Nicht zu vollständig (offen, Schleife (schreibt), schließen) zu früh. Es scheint, dass wenn eine Operation beendet wird, während die zweite Anfrage eintrifft und das Problem löst.

+0

Ich denke, das war auch der Fall in meiner Situation. Nicht sicher, wo die Ursache des Problems genau ist und wie das Problem verhindert werden sollte. – dbaw

0

Findet dies immer noch mit nur einem Thread/Prozess statt?

Wenn ja, ist es kein Threading-Problem.

Wenn nicht, dann verwenden Sie den Mutex/Lock möglicherweise nicht korrekt. Vielleicht solltest du den entsprechenden Code hier posten.

+0

Ich bin mir sicher, es gibt nur einen Prozess mit einem Thread, also brauche ich möglicherweise keine Sperre oder Mutex. Aber was passiert, wenn dieser Prozess versucht, eine Datei zu lesen (oder zu schreiben), die gerade freigegeben wird (von dem Leser oder Schreiber, der darauf zugreift)? Was bedeutet die Ausnahmebedingung eigentlich? – dbaw

+0

Eine Antwort auf die Antworten später hinzugefügt: Nein, ich habe keine Antivirus-Programme ausgeführt .. – dbaw

1

Haben Sie die Virenscan-Software in Echtzeit aktiviert?

Ich habe die Anzahl der Male gezählt, in denen Dateisperrungsprobleme durch Virenprüfsoftware verursacht wurden.

1

Ich habe diese Nachricht gesehen, wenn der Visual Studio-Debugger in einen Knoten gerät und die PDB-Datei sperrt.

Dies ist möglicherweise nicht relevant für Ihre Situation, aber Sie können bestätigen, wenn die Datei gesperrt ist (und was durch) mit einem herunterladbaren Dienstprogramm namens "Unlocker", die Sperren für Dateien und Ordner erkennen und entfernen kann.

6

Die erste Lösung wird sein, Ihr Antivirenprogramm zu deaktivieren. Besser noch können Sie den Ordner der Scan-Ausnahmeliste Ihres Antivirus hinzufügen.

0

Für mich hört sich das so an, als hätten Sie einen anderen Prozess, der alle geänderten Dateien mit Berechtigungen öffnet, was bedeutet, dass Sie sie nicht zur Änderung öffnen können. Dies könnte Antivirus, Online-Backup, Online-Dateisynchronisierung sein ...

Verwandte Themen