2009-11-12 11 views
8

ist Ich arbeite an einer Anwendung für Windows 7, und führen Sie einige Routineverzeichniserstellung Code:Directory.Exists gibt true zurück, wenn Verzeichnis nicht vorhanden

string dirPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyDir");  
if (!Directory.Exists(dirPath)) 
    Directory.CreateDirectory(dirPath); 

Das Problem ist, dass die Directory.Exists Linie true zurückgibt, wenn ich das Verzeichnis nicht über die Befehlszeile und den Windows Explorer sehen kann. Dies ist kein Problem bei der Arbeit mit Windows XP. Gibt es etwas mit Windows 7, das mir nicht bekannt ist?

EDIT: Hinzugefügt Path.Combine

+1

Environment.GetFolderPath benötigt nur ein Argument, was ist MyDir? – bobbyalex

+0

Also ist das Verzeichnis MyDir wirklich da? Oder ist es nur, dass Sie es nicht sehen können? – bobbyalex

+1

Ich denke, was fehlt (das ich annahm) ist ein Aufruf von Path.Combine, das ihm ein Unterverzeichnis MyDir des CommonApplicationData-Spezialordners geben würde. –

Antwort

11

Bitte haben Sie Verständnis, dass Windows Vista und Windows 7 verwenden Virtualisierung solche Ordner zu schützen, so dass Sie überprüfen müssen, wenn myDir in Virtuals ist,

C: \ Benutzer (Benutzername) \ AppData \ Local \ Virtuals \ Program

+0

Um dies zu erweitern: Wenn Sie zuvor versucht haben, MyDir aus einem nicht erhöhten Prozess zu erstellen, hat Windows eine virtualisierte Kopie für Sie eingerichtet. Ich glaube, dass Sie diese virtualisierte Kopie weiterhin sehen werden, selbst wenn Sie Directory.Exists von einem erhöhten Prozess überprüfen. –

+0

Ich denke, das ist näher an der Antwort, die ich brauche, aber ich habe in VirtualStore eingecheckt und MyDir dort nicht gesehen. Haben Sie Artikel über erhöhte Prozesse? Ich bin mit diesem Konzept nicht vertraut. –

+0

Außerdem können Sie Process Monitor verwenden, um tatsächlich zu überprüfen, auf welchen Ordner Ihre Anwendung zuzugreifen versuchte, um zu verstehen, wo der MyDir ist. (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) Spielen Sie damit und Sie werden es wunderbar finden. –

0

Ich weiß nicht, warum Windows 7 tut das, und ich habe nicht eine Kopie zu testen, aber Ihr Scheck an Directory.Exists (Pfad) nicht nötig sein. Wenn Sie (tief) in Directory.CreateDirectory (Pfad) reflektieren, werden Sie feststellen, dass es intern prüft, ob das Verzeichnis bereits existiert, und es ist kein Problem, es mehrmals in einem Verzeichnis anzurufen, das bereits existiert. Der Aufruf von Directory.Exists (Pfad) ist überflüssig und unnötig.

Natürlich, wenn Windows 7 nicht das Directory.Exists die Art und Weise, die ich erwarten würde, vielleicht tut es auch nicht nackt Directory.CreateDirectory. In jedem Fall ist es eine Prüfung wert.

+0

David - Ich fragte mich, über Directory.CreateDirectory. Wenn Directory.CreateDirectory mit demselben Ordner-Pfad ausgeführt wird, wird das Verzeichnis jedoch ebenfalls nicht erstellt. Mir ist klar, dass dies eine schwierige Frage ist, die ich beantworten kann, ohne die Umgebung nachahmen zu können. Daher muss ich vielleicht weiter forschen. –

0

CommonApplicationData in der Regel auf <OSDrive>\ProgramData unter Windows 7 aufgelöst. Dies ist ein versteckter Ordner. Wenn Sie den Explorer nicht bitten, versteckte Dateien und Ordner anzuzeigen (aus der Ordneroptionen-> Ansicht UI), werden Sie es im Explorer nicht sehen.

EDIT: Stellen Sie sicher, dass Sie das richtige Verzeichnis im Explorer gerade betrachten: wechseln Sie zu % Programdata%, nicht C: \ Programdata.

+0

Hallo Michael - Ich kann C: \ ProgramData sehen, aber ich kann mein Verzeichnis darunter nicht sehen. Ich laufe als Administrator, wenn das irgendwas hilft. –

+0

Hmmm. In diesem Fall weiß ich nicht. Dein Code funktioniert gut für mich.Ich schlage vor, dass Ihr kopierter Code vor der Bearbeitung falsch war, dass Sie ihn erneut versuchen und den Code direkt von Ihrer Frage kopieren. –

+0

Hätte es möglicherweise etwas mit dem Code zu tun, der auf der VM ausgeführt wird? Ich poste den ursprünglichen Code, aber es verwendet eine andere Klasse, so dass es schwierig sein wird, sie zusammenzufügen. –

Verwandte Themen