为什么IO.Directory.CreateDirectory不应该成功?

Rob*_*ers 9 .net permissions file-io

我在Vista Ultimate盒子上运行Visual Studio 2008.当我创建一个全新的控制台应用程序并通过调试器运行以下代码时,我得到一个预期的结果 - UnauthorizedAccessException抛出一个并且不创建目录.

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
Run Code Online (Sandbox Code Playgroud)

当我从生产解决方案中运行相同的代码时,该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将使用虚拟化.

感谢大家!

jva*_*erh 13

Windows Vista允许您创建目录,但它将其存储在其他位置.只有创建它的应用程序才能在您指定的路径中看到.这就是Exists返回true的原因.

这是因为旧的应用程序试图在没有权限的文件夹中保存文件不会失败.大多数人都会遇到遗留应用,试图将他们的文件保存在程序文件目录中.

这称为虚拟化,您可以设置清单,说明您不希望它适用于您的应用程序.此外,如果您使用提升的权限运行它不适用(这不是您的情况).

这也会影响注册表.

你可以在这里阅读更多相关信息.

以下是Microsoft 的参考资料.