2009-07-28 64 views
15

我使用inno setup爲我的應用程序創建安裝包,我的應用程序是用C#+ .Net 2.0 + VSTS 2008編寫的。Inno setup =>http://www.jrsoftware.org/isinfo.php我安裝我在Program Files/Foo文件夾下的應用程序(Foo是我的應用程序名稱)。我的應用程序針對Windows Vista。「程序文件」文件夾下的文件寫入權限問題

我發現的問題是我的程序無法寫入文件夾Program Files/Foo。我需要寫入這個文件夾的權限才能保存一些配置文件。我注意到的奇怪的事情是Program Files/Foo文件夾被標記爲只讀文件夾,並且我檢查了Program Files文件下標記爲只讀的所有文件夾,例如Office。

我的問題是,

  1. 爲什麼所有文件夾都標記爲只在Program Files文件閱讀?這意味着我們不應該寫入程序文件下的單個應用程序文件夾?如果不是,我們應該如何將信息寫入磁盤,如用戶上次選擇的單個應用程序的配置信息?
  2. 如果我們可以寫入程序文件下的單個應用程序文件夾,解決方案是什麼?我不希望我的應用程序以「運行身份管理員」身份來解決此問題,並且如果有解決方案可以寫入此文件夾,我希望儘可能要求最小權限。

回答

14

你應該寫用戶特定的配置數據的Application Data文件夾爲當前用戶使用special folders enumEnivronment.GetFolderPath

+0

程序文件下的單個應用程序文件夾不建議寫入?任何公佈的指導方針 – George2 2009-07-28 04:59:32

6

一個共同的解決辦法是將配置文件安裝到Application Data文件夾,即像如下:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 
+0

Program Files下的單個應用程序文件夾不建議寫入?任何公佈的指導方針 – George2 2009-07-28 04:58:59

12

最佳實踐是不將配置數據存儲在Program Files文件夾中。而應將應用程序的數據存儲在%AppData%\ YourApplicationName中。根據您是否希望存儲配置數據每用戶或一個共同的文件夾,使用下列枚舉之一得到的文件夾路徑:

string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 
string commonAppData = Envrionment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

默認情況下,Vista用戶運行程序作爲管理員,因此這些程序只讀取訪問到「程序文件」下的文件夾。用戶可以通過禁用UAC來更改此行爲,並且您可能會要求您的用戶這樣做,但在辦公室設置中,用戶可能沒有該選項。這就是您使用AppData的原因 - 應用程序始終可以讀取將數據寫入AppData文件夾。

關於UAC的信息可以在微軟的網站上找到。雖然此頁面相當長,但它是瞭解UAC的起點: http://msdn.microsoft.com/en-us/library/bb530410.aspx