2009-05-20 9 views
9

Je cours Visual Studio 2008 sur une boîte Vista Ultimate. Lorsque je crée une toute nouvelle application de console et exécute le code suivant via le débogueur, j'obtiens un résultat attendu - un UnauthorizedAccessException est lancé et le répertoire n'est pas créé.Pourquoi IO.Directory.CreateDirectory réussit-il lorsqu'il ne le devrait pas?

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 

Quand je lance ce même morceau de code de ma solution de production, la méthode est IO.Directory.CreateDirectory()pas lancer une exception, IO.Directory.Exists() renvoie la valeur true, et le répertoire ne soit pas réellement créé sur le disque.

Y a-t-il des paramètres de projet/solution qui font varier le comportement de IO.Directory.CreateDirectory() de la sorte?

Note: Je suis pas en cours d'exécution Visual Studio en tant qu'administrateur dans les deux cas.

EDIT: L'application de production s'exécute sur la même boîte que l'application de test.

EDIT # 2: L'application de production utilise la virtualisation. J'ai cliqué sur Poste de travail, navigué à C: \ Windows, et cliqué sur "Fichiers de compatibilité" dans la barre d'outils de l'explorateur et cela m'a amené à C: \ Users \ myUser \ AppData \ Local \ VirtualStore \ Windows où mes répertoires créés étaient assis.

La seule question en suspens est - pourquoi la demande de production virtualiser alors que l'application de la console de test lance une exception ??

Réponse: l'application de la console, par défaut, a été créé avec un app.manifest. L'application de production - qui est une application WPF - n'a pas de app.manifest. Apparemment, Vista utilisera la virtualisation s'il n'y a pas de app.manifest présent pour l'exécutable.

Merci à tous!

+0

Vous avez oublié d'indiquer si prod utilise également Vista. – RichardOD

+0

Etes-vous sûr que le répertoire ne soit pas créé? Essayez de créer manuellement un fichier nommé c: \ windows \ zzzz – RedFilter

Répondre

13

Windows Vista vous permet de créer le répertoire, mais il le stocke ailleurs. Seule l'application qui l'a créée peut voir dans le chemin que vous avez spécifié. C'est pourquoi Exists retourne vrai.

Cela a été mis en sorte que les anciennes applications en essayant d'enregistrer des fichiers dans des dossiers où il n'y avait aucune autorisation ne manqueraient pas. La plupart des gens rencontrent ce problème avec des applications héritées qui tentent de sauvegarder leurs fichiers dans le répertoire des fichiers du programme.

Ceci est appelé la virtualisation et vous pouvez définir un dicton manifeste que vous ne voulez pas pour votre application. Aussi, si vous courez avec des privilèges élevés, cela ne s'applique pas (ce qui n'est pas votre cas).

Cela affecte également le registre.

Vous pouvez en lire davantage here.

Voici un reference de Microsoft.

+0

Cela a du sens. Mais qu'est-ce qui fait qu'une application virtualise la création alors que l'autre lance une exception? –

+0

Intéressant, je ne le savais pas. Avez-vous une référence? – RedFilter

+0

Consultez l'article de la base de connaissances suivant http://support.microsoft.com/kb/927387/EN-US/. –

0

Directory.CreateDirectory ne jetterai pas une exception si le dossier existe déjà, de sorte que le comportement que vous rencontrez est correct.

+0

Mais le fichier n'existe pas avant le premier appel à IO.Directory.CreateDirectory. Le premier appel doit donc avoir échoué. –

+1

Ce que vous voulez dire, c'est qu'il ne semble pas exister. :-) – RichardOD

Questions connexes