2013-01-09 15 views
5

Ich habe ein seltsames Problem in unserem C# -Projekt, das beim Erstellen eines Verzeichnisses über IronPython-Skript auftritt. Dies ist der Code:IOException ("Datei oder Verzeichnis existiert bereits") beim Erstellen eines Verzeichnisses

targetTemplateDirectory = Path.Combine(Data, "Templates\\CheckedReports") 

if not Directory.Exists(targetTemplateDirectory): 
    Directory.CreateDirectory(targetTemplateDirectory) 

Das Problem ist ein IOException mir zu sagen, dass es nicht möglich ist, den Ordner "H:\ProductName\Data\Templates\CheckedReports" weil eine Datei oder ein Verzeichnis mit dem gleichen Namen existiert bereits zu erstellen.

Laut MSDN löst die Methode Directory.CreateDirectory() keine Ausnahme aus, wenn das Verzeichnis bereits existiert.

Ich weiß, dass eine Datei mit dem Namen "CheckedReports" der Grund für diese Ausnahme sein kann, aber es ist sehr, sehr unwahrscheinlich, dass der Kunde diese Datei manuell erstellt hat. Außerdem gibt es keine Codezeile, die neben dem erwähnten Skript das Wort "CheckedReports" enthält. Darüber hinaus wird die Anwendung von einigen tausend Kunden verwendet, das Skript wird auf jeder Maschine ausgeführt und nur ein Kunde hat dieses Problem gemeldet.

Gibt es eine Möglichkeit, dass diese Ausnahme anders als eine Datei mit demselben Namen auftritt? Vielleicht etwas mit Berechtigungen, Wechselmedien oder Netzlaufwerken?

+0

"aber es ist sehr, sehr unwahrscheinlich" ... angesichts der verfügbaren Informationen ist dies der wahrscheinlichste Grund. Können Sie nicht einfach überprüfen (oder lassen Sie den Kunden überprüfen), wenn eine Datei mit diesem Namen existiert? –

+0

Ich wünschte ich könnte :). Die von diesem Kunden verwendete Anwendungsversion verfügt über ein Fehlermeldesystem, das keine persönlichen oder Kontaktinformationen zulässt. Das haben wir in einem späteren Update geändert. Wir haben also nur eine Nachricht erhalten, die den Stack-Trace und eine Maschinen-ID enthält, sonst nichts. –

Antwort

3

Wir hatten das gleiche, und in unserem Fall war es ziemlich klar, dass es ein Berechtigungsproblem war. Wir haben die dokumentierte UnauthorizedAccessException erwartet, aber das haben wir nicht bekommen.

Im Verzeichnis haben wir Directory.CreateDirectory, das Directory.InternalCreateDirectory aufruft.

Im Innern gibt es diese Anmerkung:

 //Note that InternalExists may fail due 
     // to Win32 ACL's preventing us from seeing a directory, and this 
     // isn't threadsafe. 

Es gibt mehr Hinweise darüber, die tiefer in diese Tatsache gehen, versuchen Sie den Code kann das Verzeichnis zu erstellen, die bereits vorhanden ist, wenn es nicht sehen konnte .

5

Obwohl es ein bisschen übertrieben wäre, dies nur für einen Benutzer zu haben, sollte es möglich sein zu überprüfen, ob eine Datei mit diesem Namen existiert.

Wahrscheinlich würde dies das Problem lösen, WENN natürlich die E/A-Ausnahme von einer Datei mit demselben Namen verursacht wurde. Wenn es durch den Benutzer verursacht würde, weil der "Netzwerkname nicht bekannt ist", dann hätte ich auch keine Ahnung.

+0

Vielleicht ist es ein bisschen Paranoia und es gibt keinen anderen Grund für diese Ausnahme, aber es ist fatal, weil es während des Update-Prozesses geworfen wird und verhindert, dass die Anwendung gestartet wird. Ich werde Ihrer Lösung einen Versuch geben, zumindest löst sie einen Fehler, der durch eine Datei mit dem gleichen Namen verursacht wird, egal ob sie manuell vom Kunden erstellt wird oder programmatisch aufgrund eines Fehlers in unserer Anwendung, unserem Setup oder der Interaktion mit eine andere Anwendung. –

+0

Dies ist die einzige Lösung (von vielen), die für mich funktionierte. –

Verwandte Themen