2009-05-20 16 views
9

Ich verwende Visual Studio 2008 auf einer Vista Ultimate-Box. Wenn ich eine nagelneue Konsolenanwendung erstelle und den folgenden Code über den Debugger ausführe, erhalte ich ein erwartetes Ergebnis - ein UnauthorizedAccessException wird geworfen und das Verzeichnis wird nicht erstellt.Warum ist IO.Directory.CreateDirectory erfolgreich, wenn dies nicht der Fall ist?

Sub Main() 
    Dim path = "C:\Windows\zzzz" 
    Try 
     IO.Directory.CreateDirectory(path) 
    Catch ex As Exception 
     Console.WriteLine(ex.Message) 
    End Try 
    Console.WriteLine(IO.Directory.Exists(path).ToString) 
    Console.ReadLine() 
End Sub 

Wenn ich das gleiche Stück Code aus meiner Produktionslösung ausgeführt, die IO.Directory.CreateDirectory() Methode ist nicht eine Ausnahme zu werfen, IO.Directory.Exists() gibt Wahr zurück, und das Verzeichnis nicht tatsächlich auf der Festplatte erstellt bekommen.

Gibt es Projekt-/Lösungseinstellungen, die das Verhalten von IO.Directory.CreateDirectory() variieren würden?

Hinweis: Ich bin nicht in jedem Fall Visual Studio als Administrator ausgeführt wird.

EDIT: Die Produktion Anwendung läuft auf der gleichen Box wie die Testanwendung.

EDIT # 2: Die Produktionsanwendung verwendet Virtualisierung. Ich klickte auf Arbeitsplatz, navigierte zu C: \ Windows und klickte auf "Compatibility Files" in der Explorer-Symbolleiste und brachte mich zu C: \ Benutzer \ myUser \ AppData \ Local \ VirtualStore \ Windows, wo meine erstellten Verzeichnisse waren.

Die einzige offene Frage ist - warum die Produktionsanwendung virtualisiert, während die Testkonsole eine Ausnahme auslöst ??

Antwort: Die Konsolenanwendung wurde standardmäßig mit einem app.manifest erstellt. Die Produktionsanwendung, bei der es sich um eine WPF-Anwendung handelt, hatte kein app.manifest. Anscheinend wird Vista die Virtualisierung verwenden, wenn für das Executable kein app.manifest vorhanden ist.

Danke allen!

+0

Sie haben vergessen zu sagen, ob Prod läuft auch Vista. – RichardOD

+0

Sind Sie sicher, dass das Verzeichnis nicht erstellt wird? Versuchen Sie, manuell eine Datei mit dem Namen c: \ windows \ zzzz zu erstellen. – RedFilter

Antwort

13

Mit Windows Vista können Sie das Verzeichnis erstellen, es wird jedoch woanders gespeichert. Nur die Anwendung, die sie erstellt hat, kann den von Ihnen angegebenen Pfad sehen. Das ist der Grund, warum Exists wahr ist.

Dies wurde eingefügt, damit alte Anwendungen, die versuchen, Dateien in Ordnern zu speichern, in denen keine Berechtigungen vorhanden waren, nicht fehlschlagen würden. Die meisten Leute stoßen darauf mit Legacy-Apps, die versuchen, ihre Dateien im Verzeichnis der Programmdateien zu speichern.

Dies wird als Virtualisierung bezeichnet und Sie können ein Manifest festlegen, das besagt, dass Sie es nicht für Ihre Anwendung möchten. Auch wenn Sie mit erhöhten Rechten arbeiten, gilt es nicht (was nicht Ihr Fall ist).

Dies betrifft auch die Registrierung.

Sie können mehr darüber lesen here.

Hier ist ein reference von Microsoft.

+0

Das macht Sinn. Aber was bewirkt, dass eine Anwendung die Erstellung virtualisiert, während die andere eine Ausnahme auslöst? –

+0

Interessant, das wusste ich nicht. Hast du eine Referenz? – RedFilter

+0

Siehe folgenden KB-Artikel http://support.microsoft.com/kb/927387/EN-US/. –

0

Directory.CreateDirectory wird keine Exception ausgelöst, wenn der Ordner bereits existiert. Das Verhalten ist also korrekt.

+0

Die Datei existiert jedoch nicht bereits vor dem ersten Aufruf von IO.Directory.CreateDirectory, daher sollte der erste Aufruf fehlschlagen. –

+1

Was Sie meinen, war es schien nicht zu existieren. :-) – RichardOD

Verwandte Themen