2009-05-20 68 views
9

我在Vista Ultimate盒子上运行Visual Studio 2008。当我创建一个全新的控制台应用程序并通过调试器运行以下代码时,我得到了预期的结果 - 将引发一个UnauthorizedAccessException并且不会创建该目录。为什么IO.Directory.CreateDirectory不应该成功?

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 

当我从我的生产解决方案运行这段代码相同的位,该IO.Directory.CreateDirectory()方法是抛出一个异常,IO.Directory.Exists()返回True,和目录实际上不获取在磁盘上创建。

是否有任何项目/解决方案设置可以使IO.Directory.CreateDirectory()的行为像这样变化?

注意:我是而不是在这两种情况下都以管理员身份运行Visual Studio。

编辑:生产应用程序与测试应用程序在同一个框中运行。

编辑#2:生产应用程序正在使用虚拟化。我点击我的电脑,导航到C:\ Windows,并在浏览器工具栏上点击“兼容性文件”,它将我带到我创建的目录所在的C:\ Users \ myUser \ AppData \ Local \ VirtualStore \ Windows。

唯一未解决的问题是 - 为什么测试控制台应用程序抛出异常时生产应用程序虚拟化?

答案:默认情况下,控制台应用程序是使用app.manifest创建的。生产应用程序 - 这是一个WPF应用程序 - 没有app.manifest。如果可执行程序没有app.manifest,显然Vista将使用虚拟化。

谢谢大家!

+0

您忘记说明prod是否也在运行Vista。 – RichardOD 2009-05-20 14:29:44

+0

你确定该目录没有被创建?尝试手动创建一个名为c:\ windows \ zzzz的文件 – RedFilter 2009-05-20 14:32:57

回答

13

Windows Vista让你创建目录,但它将它存储在别的地方。只有创建它的应用程序才能在您指定的路径中看到。这就是Exists返回true的原因。

这是为了让旧应用程序试图保存文件夹中没有权限的文件不会失败。大多数人用遗留应用程序来试图将它们的文件保存在程序文件目录中。

这就是所谓的虚拟化,您可以设置一个清单,声明您不希望它为您的应用程序。此外,如果您使用提升的权限运行,则不适用(这不是您的情况)。

这也影响注册表。

您可以阅读更多关于它here

这是来自Microsoft的reference

0

Directory.CreateDirectory如果该文件夹已经存在,则不会抛出异常,所以您遇到的行为是正确的。

+0

但是在第一次调用IO.Directory.CreateDirectory之前文件并不存在,所以第一次调用应该失败。 – 2009-05-20 14:29:02

相关问题