.net 为什么IO.Directory.CreateDirectory在不应该成功的情况下却成功了?

.net 为什么IO.Directory.CreateDirectory在不应该成功的情况下却成功了?,.net,file-io,permissions,.net,File Io,Permissions,我正在Vista Ultimate box上运行Visual Studio 2008。当我创建一个全新的控制台应用程序并通过调试器运行以下代码时,我得到了一个预期的结果—抛出UnauthorizedAccessException,并且不创建目录 Sub Main() Dim path = "C:\Windows\zzzz" Try IO.Directory.CreateDirectory(path) Catch ex As Exception

我正在Vista Ultimate box上运行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
当我从生产解决方案中运行这段代码时,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将使用虚拟化


谢谢大家

Directory.CreateDirectory如果文件夹已经存在,则不会引发异常,因此您所经历的行为是正确的。

Windows Vista允许您创建目录,但将其存储在其他地方。只有创建它的应用程序才能在指定的路径中看到它。这就是为什么Exists返回true

这是为了让旧应用程序在没有权限的文件夹中保存文件不会失败。大多数人都会遇到这种情况,他们使用的是旧版应用程序,这些应用程序试图将文件保存在program files目录中

这称为虚拟化,您可以设置一个清单,表明您不希望应用程序使用它。此外,如果您以提升的权限运行,则不适用,这与您的情况不同

这也会影响注册表

你可以阅读更多关于它的内容


这是微软的一份报告

但是在第一次调用IO.Directory.CreateDirectory之前,该文件不存在,因此第一次调用应该失败。您的意思是它似乎不存在:-您忘记说明prod是否也在运行Vista。是否确实未创建目录?尝试手动创建一个名为c:\windows\zzzz的文件,这很有意义。但是,是什么让一个应用程序虚拟化创建,而另一个应用程序抛出异常呢?有趣的是,我不知道这一点。你有推荐人吗?