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

时间:2009-05-20 14:23:11

标签: .net file-io permissions

我在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

当从我的生产解决方案运行的代码此相同的位时,IO.Directory.CreateDirectory()的方法是的抛出异常,IO.Directory.Exists()返回True,并的目录实际上并没有在磁盘上创建。

是否有任何项目/解决方案设置会使IO.Directory.CreateDirectory()的行为变化如此?

注意:在任何一种情况下,我以管理员身份运行Visual Studio。

编辑:生产应用程序与测试应用程序在同一个盒子上运行。

编辑#2:生产应用程序正在使用虚拟化。我点击我的电脑,导航到C上:\ Windows和资源管理器工具栏上点击“兼容性文件”,它给我带来了C:\用户\ MYUSER \应用程序数据\本地\ VirtualStore \其中我创建的目录坐在窗口。

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

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

谢谢大家!

2 个答案:

答案 0 :(得分:13)

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

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

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

这也影响了注册表。

您可以详细了解here

以下是Microsoft的reference

答案 1 :(得分:0)

如果文件夹已存在,

Directory.CreateDirectory将不会抛出异常,因此您遇到的行为是正确的。