2009-05-20 85 views
9

我在Vista Ultimate盒子上運行Visual Studio 2008。當我創建一個全新的控制檯應用程序並通過調試器運行以下代碼時,我得到了預期的結果 - 將引發一個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。

編輯:生產應用程序與測試應用程序在同一個框中運行。

編輯#2:生產應用程序正在使用虛擬化。我點擊我的電腦,導航到C:\ Windows,並在瀏覽器工具欄上點擊「兼容性文件」,它將我帶到我創建的目錄所在的C:\ Users \ myUser \ AppData \ Local \ VirtualStore \ Windows。

唯一未解決的問題是 - 爲什麼測試控制檯應用程序拋出異常時生產應用程序虛擬化?

答案:默認情況下,控制檯應用程序是使用app.manifest創建的。生產應用程序 - 這是一個WPF應用程序 - 沒有app.manifest。如果可執行程序沒有app.manifest,顯然Vista將使用虛擬化。

謝謝大家!

+0

您忘記說明prod是否也在運行Vista。 – RichardOD 2009-05-20 14:29:44

+0

你確定該目錄沒有被創建?嘗試手動創建一個名爲c:\ windows \ zzzz的文件 – RedFilter 2009-05-20 14:32:57

回答

13

Windows Vista讓你創建目錄,但它將它存儲在別的地方。只有創建它的應用程序才能在您指定的路徑中看到。這就是Exists返回true的原因。

這是爲了讓舊應用程序試圖保存文件夾中沒有權限的文件不會失敗。大多數人用遺留應用程序來試圖將它們的文件保存在程序文件目錄中。

這就是所謂的虛擬化,您可以設置一個清單,聲明您不希望它爲您的應用程序。此外,如果您使用提升的權限運行,則不適用(這不是您的情況)。

這也影響註冊表。

您可以閱讀更多關於它here

這是來自Microsoft的reference

0

Directory.CreateDirectory如果該文件夾已經存在,則不會拋出異常,所以您遇到的行爲是正確的。

+0

但是在第一次調用IO.Directory.CreateDirectory之前文件並不存在,所以第一次調用應該失敗。 – 2009-05-20 14:29:02