Почему IO.Directory.CreateDirectory успешно работает, а это не так? - PullRequest
9 голосов
/ 20 мая 2009

Я использую Visual Studio 2008 на Vista Vista Ultimate. Когда я создаю новое консольное приложение и запускаю следующий код через отладчик, я получаю ожидаемый результат - выдается 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. Очевидно, Vista будет использовать виртуализацию, если для исполняемого файла нет app.manifest.

Спасибо всем!

Ответы [ 2 ]

13 голосов
/ 20 мая 2009

Windows Vista позволяет вам создавать каталог, но хранит его где-то еще. Только указанное вами приложение может видеть по указанному вами пути. Вот почему Exists возвращает true.

Это было сделано для того, чтобы старые приложения, пытающиеся сохранить файлы в папках, где не было разрешений, не потерпели неудачу. Большинство людей сталкиваются с этим с устаревшими приложениями, которые пытаются сохранить свои файлы в каталоге программных файлов.

Это называется виртуализацией, и вы можете установить манифест о том, что вы не хотите использовать его для своего приложения. Также, если вы работаете с повышенными привилегиями, это не применяется (что не в вашем случае).

Это также влияет на реестр.

Подробнее об этом можно прочитать здесь .

Вот ссылка от Microsoft.

0 голосов
/ 20 мая 2009

Directory.CreateDirectory не вызовет исключение, если папка уже существует, поэтому поведение, которое вы испытываете, является правильным.

...