2013-09-04 7 views
5

Ich habe einen Prozess, der eine Datei in einem temporären Verzeichnis schreibt. Die Datei wird ohne gemeinsamen Lesezugriff geschrieben, so dass, wenn jemand versucht, diese Datei während des Schreibens zu lesen, IOException geworfen wird, , was in Ordnung ist.Random UnauthorizedAccessException beim Lesen einer Datei in% temp%

In einigen seltenen Fällen scheint ich UnauthorizedAccessException zu bekommen, während ich versuche, diese Datei zu lesen. Ich bin ziemlich sicher (aus den Logs), dass die Datei nicht geschrieben wird, aber ich kann keinen anderen Grund sehen, auf den ich keinen Zugriff hätte.

Der Prozess wird auch von einer Visual Studio-Erweiterung ausgeführt, was bedeutet, dass er die gleichen Berechtigungen wie der übergeordnete Prozess (Visual Studio selbst) hat.

Hier ist, wie ich versuche, die Datei zu öffnen:

new FileStream(cacheFileName, FileMode.Open, FileAccess.Read, FileShare.Read); 

Manchmal diese Linie wirft ein UnauthorizedAccessException. Irgendwelche Ideen warum?

+0

Vielleicht greift der Virenscanner auf diese Datei zu? – Steven

+0

Vielleicht, aber wieder, UAE? Ich würde eine bloße IOException erwarten. –

+0

http://www.codeproject.com/Questions/93239/System-UnauthorizedAccessException http://www.csharp-examples.net/filestream-open-file/ – SK2185

Antwort

3

Es ist definitiv kein Problem mit der Freigabe, das einen Fehler bei der Freigabe der Verletzung erzeugt und der mit einer IOException gemeldet wird.

Es gibt nur zwei anständige Erklärungen für UnauthorizedAccessException. Einer ist der logische, die Datei wurde mit einer benutzerdefinierten ACL erstellt, die den Zugriff einfach verweigert. In diesem Fall müssen Sie viel mehr über den Prozess wissen, der die Datei erstellt hat und sie über den Kopf schlagen, so dass sie damit aufhört. Es kann wichtig sein, das Benutzerkonto zu steuern, das von diesem Prozess verwendet wird.

Die zweite Erklärung steht im Zusammenhang mit den Unwägbarkeiten vieler Prozesse beim Erstellen von Dateien und Verzeichnissen im TEMP-Verzeichnis. Es ist sehr wichtig, dass die Dateien, die dort erstellt werden, transaktional sind und dass Sie dem System erlauben, Dateinamen zu generieren, um sicherzustellen, dass es nie zu einer Namenskollision kommt. Wenn ein Prozess eine Datei erstellt und einem anderen erlaubt, sie zu öffnen, wird nach Problemen gefragt. Sie erhalten UnauthorizedAccessException, wenn das TEMP-Verzeichnis ein Verzeichnis mit dem gleichen Namen der Datei enthält, die Sie öffnen möchten.

Das Debuggen dieses Problems ist schwierig, wenn dies selten vorkommt und die Datei (en) schnell wieder verschwinden. Sie können enable auditing fehlgeschlagene Versuche beim Öffnen der Datei protokollieren.

0

Persönlich würde ich ProcMon http://technet.microsoft.com/en-gb/sysinternals/bb896645.aspx mit einem Filter für Ihre Datei ausführen und sehen, ob es noch etwas gibt, das auf die Datei zugreift und in den Weg Ihres Codes gerät.

+0

Danke, aber das passiert nicht auf meinem Rechner, sondern auf mehreren Rechnern. Alles, was ich habe, sind die Protokolle. Vielleicht, wenn wir es "live" fangen können, dann könnte ich den Benutzer bitten, ProcMon zu starten ... –

+2

Verwenden Sie http://technet.microsoft.com/en-us/sysinternals/bb896655.aspx in Ihrer Ausnahme vielleicht? Und speichern Sie das im Protokoll. Sie könnten auch versuchen, einige davon, http://stackoverflow.com/questions/4964588/open-file-readonly Vielleicht öffnen Sie es im ReadWrite-Modus Zugriff verweigert. Oder haben Sie einen anderen Ihrer eigenen Threads Zugriff darauf, machen Sie sich selbst derjenige, der die Datei hat? – Sarkie

Verwandte Themen