2009-05-20 4 views
9

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

EDIT: Производственное приложение работает в том же поле, что и тестовое приложение.

EDIT # 2: Производственное приложение использует виртуализацию. Я нажал на «Мой компьютер», перешел на C: \ Windows и нажал «Файлы совместимости» на панели инструментов проводника, и он привел меня в C: \ Users \ myUser \ AppData \ Local \ VirtualStore \ Windows, где сидели мои созданные каталоги.

Единственный непонятный вопрос - почему виртуализация производственного приложения, в то время как приложение тестовой консоли выдает исключение?

Ответ: консольное приложение по умолчанию было создано с помощью app.manifest. В приложении для производства, которое является приложением WPF, не было app.manifest. Видимо, Vista будет использовать виртуализацию, если нет приложения app.manifest для исполняемого файла.

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

+0

Вы забыли указать, работает ли prod с Vista. – RichardOD

+0

Вы уверены, что каталог не создается? Попробуйте вручную создать файл с именем c: \ windows \ zzzz – RedFilter

ответ

13

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

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

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

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

Подробнее об этом можно узнать here.

Адрес reference от Microsoft.

+0

Это имеет смысл. Но что заставляет одно приложение виртуализировать создание, а другое - исключение? –

+0

Интересно, я этого не знал. У вас есть ссылка? – RedFilter

+0

См. Следующую статью KB http://support.microsoft.com/kb/927387/EN-US/. –

0

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

+0

Но файл еще не существует до первого вызова IO.Directory.CreateDirectory, поэтому первый вызов должен завершиться неудачно. –

+1

То, что вы имели в виду, казалось, не существовало. :-) – RichardOD

Смежные вопросы